gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:43:26 28 4
gpt4 key购买 nike

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

我修改了我的 Condition 以实现 ConfigurationCondition 并在 REGISTER_BEAN 阶段指定评估。该方法在配置器被实例化之前仍然被调用,但是注册的 bean 现在随着我从属性文件中添加或删除属性来来去去。

这是重新排序评估的最佳方式吗?这是 ConfigurationCondition 接口(interface)的用途,还是我现在不小心让它工作了?

@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();
}
}

最佳答案

parsing phase @Configuration 类涉及 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 所看到的结果是预期的,因为这些属性实际上在 Environment 中可用注册 bean 的定义和解析 @Configuration 类之后的时间。仅使用 Condition 我相信它甚至没有达到 @Configuration 的解析阶段,甚至在此之前完成评估,当 @Configuration 类定义要注册。

关于spring - 如何延迟对 Spring @Conditional 配置注释的评估?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23526643/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com