chr*_*ke- 12 spring spring-java-config
我有一个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);
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
测试配置是我测试用例的静态类:
@Configuration
@ComponentScan
@PropertySource("classpath:/postback.properties")
@Import(PostbackUrlConfiguration.class)
public static class TestConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Run Code Online (Sandbox Code Playgroud)
And*_*fan 10
该分析阶段一@Configuration类涉及读取其类的定义,填充配置对象的集合(因为一个@Configuration类可能@Import另一个@Configuration类,所以这些进口被解析为好),处理@PropertySources,@ImportResources等等.
处理@PropertySources也不会加载这些属性.解析阶段完成后,将@PropertySources加载属性.加载完这些后,@Configuration将注册bean内部类的定义(REGISTER_BEAN阶段).
因此,您所看到的使用ConfigurationConditionwith ConfigurationPhase.REGISTER_BEAN阶段是可以预期的,因为这些属性实际上在Environmentbean的定义被注册时以及在@Configuration解析了类之后可用.使用一个Condition我相信它甚至没有达到a的解析阶段,@Configuration甚至在此之前,当要@Configuration定义类定义时,评估就完成了.
| 归档时间: |
|
| 查看次数: |
4076 次 |
| 最近记录: |