Как создать пользовательское условие, аналогичное «@ConditionalOnProperty», без использования spring-boot?

#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 непосредственно