Свойства загрузки Spring, которые должны быть загружены при инициализации и уважать все, и управлять @Aspect на основе значения из файла свойств - PullRequest
0 голосов
/ 04 февраля 2019

Мы загружаем свойства из внешнего файла, используя @PropertySources.Теперь я хочу включить / отключить @Aspect на основе свойства.Я пытался использовать @ConditionalOnExpression, который не работал.Я попробовал то же самое, создав бин propertyplaceholderconfig.Даже в том же случае это не сработало.Затем я попробовал @profile, который тоже изначально не работал.

Я понял, что эти переменные не инициализируются при запуске, когда bean-компонент propertysource или propertyplaceholder используется при запуске.Некоторые переменные всегда игнорируются, например (logging.file).Но @Value работает отлично.Чтобы установить эти переменные, я должен передать их как параметры JVM.

Итак, мои вопросы:
1. Как я могу заставить Spring всегда читать указанные файлы свойств при запуске иуважать их всех?
2. Какой лучший способ включить / отключить @Aspect.Используя @profile или @ConditionalOnExpression или что-то еще?

В настоящее время мы устанавливаем logging.file в методе main, поскольку это также ведет себя так же.Но вы, ребята, знаете, что это неправильный способ, так как я могу добавить свойства по одному, как это.Я хочу поместить все свойства во внешние файлы, чтобы Spring читал эти файлы и устанавливал их свойства.

Структура наших свойств:

  1. common.properties # У него есть все общие свойства
  2. 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. 

Я новичок в весенней загрузке, поэтому, пожалуйста, дайтеменя знают для дополнительных уточнений.

1 Ответ

0 голосов
/ 16 февраля 2019

Кажется, что Spring по умолчанию загружает некоторые свойства при инициализации, и до тех пор, пока вы специально не напишите логику, чтобы перезаписать их (подобно тому, что я написал в MainClass.java) , никакой опции нетпереопределить те.Некоторые из них включают (logging.file, ключ, используемый в @ConditionalonExpression).

Некоторые приемы со своими проблемами:

  1. Укажите свойства в application.properties в вашем пути к классам.Переменные, загруженные на более ранних этапах, всегда читаются из этого файла. вызов: я тесно связал все свои свойства в банке, и для изменения значений мне нужно перекомпилировать и перезапустить банку.
  2. Использовать профили и определить application.properties какapplication-profile.properties. задача: мне нужно создать так много профилей, но предыдущая задача существует.
  3. Передайте значение свойства в качестве параметра JVM как -Dproperty.key=value. Задача: серьезно?Сколько свойств я должен отправить в качестве параметра JVM?
  4. Реализация ApplicationContextInitialize и метод переопределения initialize. Проблема: переопределение поведения Spring по умолчанию не рекомендуетсяа также не является ли излишним использование этого только для чтения файла свойств?

Решение:

Используйте -Dspring.config.location для указания файлов свойств,В этом случае всегда пружина считывает свойства только из указанного местоположения.Вы также можете предоставить несколько файлов свойств. См. Это для получения более подробной информации. Кажется, если вы указали расположение свойств, поскольку каталоги подпружиненно загружают их в обратном порядке.Но если вы указываете файлы, они следуют указанному порядку.

Примечание. Все они могут быть объединены вместе. Чтобы узнать о приоритете, обратитесь к .

...