Мы загружаем свойства из внешнего файла, используя @PropertySources
.Теперь я хочу включить / отключить @Aspect
на основе свойства.Я пытался использовать @ConditionalOnExpression
, который не работал.Я попробовал то же самое, создав бин propertyplaceholderconfig
.Даже в том же случае это не сработало.Затем я попробовал @profile
, который тоже изначально не работал.
Я понял, что эти переменные не инициализируются при запуске, когда bean-компонент propertysource
или propertyplaceholder
используется при запуске.Некоторые переменные всегда игнорируются, например (logging.file).Но @Value
работает отлично.Чтобы установить эти переменные, я должен передать их как параметры JVM.
Итак, мои вопросы:
1. Как я могу заставить Spring всегда читать указанные файлы свойств при запуске иуважать их всех?
2. Какой лучший способ включить / отключить @Aspect
.Используя @profile
или @ConditionalOnExpression
или что-то еще?
В настоящее время мы устанавливаем logging.file
в методе main, поскольку это также ведет себя так же.Но вы, ребята, знаете, что это неправильный способ, так как я могу добавить свойства по одному, как это.Я хочу поместить все свойства во внешние файлы, чтобы Spring читал эти файлы и устанавливал их свойства.
Структура наших свойств:
- common.properties # У него есть все общие свойства
- service.properties # Свойство, относящееся к услуге.Это также будет содержать существующее свойство из common.properties, которое будет переопределено.
Я понимаю, что могу использовать профили.Но мы хотим, чтобы свойства оставались такими, что вам нужно перезапустить службу, если вы изменяете свойства.Я также не хочу передавать переменные как параметры JVM, тогда я должен передать большинство переменных таким образом.Передача -Dspring.config.location также затруднена, так как используются common.properties
и service.properties
, а имя файла service.properties варьируется для каждой службы.
примеры кодов:
Основной класс:
@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);
}
}
Контекст приложения:
@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);
}
}
Здесь вы можете увидеть любой способ, которым я пользовался environment
чтобы получить property
.Есть ли способ установить свойство с помощью среды, чтобы при самой весенней инициализации загрузки свойства заполнялись?
Мы также можем реализовать ApplicationContextInitializer
и переопределить initialize
метод для чтения свойств.Но как я могу сделать так, чтобы он прочитал 2 файла свойств и переопределил свойство duplicate на самое последнее значение? Ссылка (я не уверен, как реализовать мои требования таким образом.) .Даже в этом случае не похоже, что вы пытаетесь убить комара молотком?
Текущее рабочее решение:
@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.
Я новичок в весенней загрузке, поэтому, пожалуйста, дайтеменя знают для дополнительных уточнений.