Propriedades de inicialização da mola a serem carregadas na inicialização e respeitam todos e controlam @Aspect com base no valor do arquivo de propriedades
Estamos carregando propriedades de um arquivo externo usando@PropertySources
. Agora eu quero ativar / desativar@Aspect
com base em uma propriedade. Eu tentei usar@ConditionalOnExpression
que não funcionou. Tentei o mesmo criando um bean depropertyplaceholderconfig
. Mesmo no mesmo caso, não funcionou. Então eu tentei@profile
que também não funcionou inicialment
O que eu descobri é que essas variáveis não são inicializadas no início quandopropertysource
oupropertyplaceholder
bean é usado na inicialização. Algumas variáveis são sempre ignoradas como (logging.file). Mas@Value
funciona bem. Para definir essas variáveis, preciso transmiti-las como parâmetros da JV
Então minhas perguntas são:
1. Como posso fazer com que o spring sempre leia os arquivos de propriedades especificados na inicialização e respeite todos ele
2. Qual é a melhor maneira de ativar / desativar@Aspect
. Usando@profile
ou@ConditionalOnExpression
ou alguma outra coisa
Atualmente, estamos definindologging.file
no método principal, pois isso também se comporta da mesma maneira. Mas vocês sabem que não é o caminho certo, pois eu posso acabar adicionando as propriedades uma por uma assim. Quero colocar todas as propriedades em arquivos externos, para que o Spring leia esses arquivos e defina suas propriedade
Nossa estrutura de propriedades:
common.properties #Isso tem todas as propriedades comuns service.properties # Propriedade específica de um serviço. Isso também conterá a propriedade existente de common.properties que será substituída. Entendo que posso usar perfis. Porém, queremos manter as propriedades fora, para que você precise reiniciar o serviço se estiver alterando as propriedades. Também não quero passar as variáveis como parâmetros da JVM, então tenho que passar a maioria das variáveis dessa maneira. Passar -Dspring.config.location também é difícil, poiscommon.properties
eservice.properties
são usados e o nome do arquivo 'service.properties' varia para cada serviç
códigos de amostra:
Mainclass:
@PropertySources({
@PropertySource(value = "file:${property_path}/common.properties", ignoreResourceNotFound = false),
@PropertySource(value = "file:${property_path}/service1.properties", ignoreResourceNotFound = true) })
public class MainClass {
static String logDirectory = ApplicationContext.getGlobalProperty("logging.file");
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(MainClass.class);
Properties properties = new Properties();
properties.put("logging.file", logDirectory);
, springApplication.setDefaultProperties(properties);
springApplication.run(args);
}
}
Contexto do aplicativo:
@Configuration
@EnableAutoConfiguration
public class ApplicationContext implements EnvironmentAware {
private static Environment environment;
@Override
public void setEnvironment(Environment environment) {
ApplicationContext.environment = environment;
}
public static String getGlobalProperty(String propertyName) {
return environment.getProperty(propertyName);
}
}
Aqui você pode ver como eu useienvironment
para obterproperty
. Existe alguma maneira de definir a propriedade usando o ambiente, de modo que, enquanto a própria inicialização de inicialização por primavera, as propriedades são preenchidas?
Nós também podemos implementarApplicationContextInitializer
e substituirinitialize
método para ler propriedades. Mas como posso ler dois arquivos de propriedades e substituir a propriedade duplicada pelo valor mais recente?Reference (não sei como implementar meus requisitos dessa maneira.). Mesmo neste caso, não parece que você está tentando matar um mosquito com um martelo?
olução de trabalho atual:
@Aspect
@Profile("!production")
@Configuration
public class ControllerAspect {
@pointcut(....)
} //Here also I've to pass spring.profiles.active as JVM params.
//setting the value in common.properties or service1.properties is not working.
Eu sou um novato na bota de primavera, por favor me avise para esclarecimentos adicionai