我有一个Spring @Configuration
类,它应该在环境中设置特定属性值时注册bean。我编写了一个自定义Condition
实现,检查该值是否存在,并且当我在Spring Boot中启动应用程序时它可以工作,但是在运行JUnit测试时从未注册过bean。我调试了应用程序并确定在Condition
被实例化之前正在评估PropertySourcesPlaceholderConfigurer
。
我修改了Condition
以实施ConfigurationCondition
并在REGISTER_BEAN
阶段指定评估。在实例化configurer之前仍然会调用该方法,但是当我从属性文件中添加或删除属性时,已注册的bean现在来去。
这是重新评估评估的最佳方式吗?这是ConfigurationCondition
界面的用途,还是我现在不小心让它工作了?
@Conditional(PropertyCondition.class)
@Configuration
public class PostbackUrlConfiguration {
@Value("${serviceName.postbackUrl}")
String postbackUrl;
@Bean
public PostbackUrlProvider provider() {
return new FixedUrlProvider(postbackUrl);
}
}
public class PropertyCondition implements ConfigurationCondition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().containsProperty("serviceName.postbackUrl");
}
@Override
public ConfigurationPhase getConfigurationPhase() {
return ConfigurationPhase.REGISTER_BEAN;
}
}
测试配置是我测试用例的静态类:
@Configuration
@ComponentScan
@PropertySource("classpath:/postback.properties")
@Import(PostbackUrlConfiguration.class)
public static class TestConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
答案 0 :(得分:10)
@Configuration
课程的parsing phase涉及reading its class definition, populating a collection of Configuration objects (because one @Configuration
class may @Import
another @Configuration
class so these imports are parsed as well), processing @PropertySources
, @ImportResources
etc。
处理@PropertySources
也不会加载这些属性。解析阶段完成后,将加载@PropertySources
属性。加载完这些后,将注册来自@Configuration
类内的bean的定义(REGISTER_BEAN阶段)。
因此,您所看到的ConfigurationCondition
与ConfigurationPhase.REGISTER_BEAN
阶段的关系是预期的,因为这些属性实际上在注册bean定义时Environment
可用,并且在@Configuration
之后{1}}类已被解析。
仅使用Condition
我认为它甚至没有达到@Configuration
的解析阶段,即使在此之前,当要注册@Configuration
类定义时,评估也会完成。< / p>