#java #spring
#Ява #весна
Вопрос:
Я пытаюсь создать пользовательское условие, используя контекст spring.
- Я использую spring-контекст 5.3.13 (без пружинной загрузки)
- У меня есть файл с именем «config.yaml» в разделе «src/main/ресурсы».
- У меня настроена эта пользовательская настройка @PropertySource: @PropertySource(значение = «путь к классу:конфигурация.yaml», завод = TypesafeAdapterPropertySourceFactory.class)
- Я пытаюсь получить свойство из пользовательского состояния пружины:
public class MyConditionalOnProperty implements ConfigurationCondition { @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { // just to test what property sources are present for(Iterator it = ((AbstractEnvironment) context.getEnvironment()).getPropertySources().iterator(); it.hasNext(); ) { PropertySource propertySource = (PropertySource) it.next(); System.out.println(propertySource.getName()); //prints only "systemProperties" and "systemEnvironment" } return context.getEnvironment().containsProperty("my.prop"); } @Override public ConfigurationPhase getConfigurationPhase() { return ConfigurationPhase.REGISTER_BEAN; } }
- my.prop присутствует после загрузки контекста приложения
- У меня есть боб, аннотированный условием:
@Named @Singleton @Conditional(PropertyEnabledCondition.class) public class MyTestBean { }
Я также отладил и обнаружил, что мой источник пользовательских свойств загружается только после этого этапа.
Есть ли способ получить свойства приложения в состоянии или воссоздать @ConditionalOnProperty без использования spring-boot каким-либо другим способом?
Ответ №1:
Проблема заключалась в том, что мои аннотации @PropertySource находились непосредственно в основном классе настройки моего приложения, но в другой конфигурации. Это означает, что они были обработаны только после того, как бобы были зарегистрированы.
Поэтому, если вы инициируете свой контекст так:
var context = new AnnotationConfigApplicationContext(SpringConfig.class);
убедитесь, что у вас есть @PropertySource с комментариями на SpringConfig.java непосредственно