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