其他分享
首页 > 其他分享> > 如何延迟Spring @Conditional配置注释的评估?

如何延迟Spring @Conditional配置注释的评估?

作者:互联网

我有一个Spring @Configuration类,它应该在环境中设置特定属性值时注册bean.我编写了一个自定义Condition实现,检查该值是否存在,并且当我在Spring Boot中启动应用程序时它可以工作,但是在运行JUnit测试时从未注册过bean.我调试了应用程序并确定在实例化PropertySourcesPlaceholderConfigurer之前正在评估Condition.

我修改了我的条件以实现ConfigurationCondition并在REGISTER_BEAN阶段指定评估.在实例化配置器之前仍然调用该方法,但是当我从属性文件中添加或删除属性时,已注册的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();
    }
}

解决方法:

@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阶段).

因此,您看到使用带有ConfigurationPhase.REGISTER_BEAN阶段的ConfigurationCondition的情况是预期的,因为在注册bean的定义时以及解析了@Configuration类之后,这些属性实际上在环境中可用.
仅使用一个条件我相信它甚至都没有达到@Configuration的解析阶段,甚至在此之前,当要注册@Configuration类定义时,评估就完成了.

标签:spring-java-config,spring
来源: https://codeday.me/bug/20191005/1856964.html