在Condition或ConfigurationCondition中使用上下文bean

时间:2017-09-29 02:55:31

标签: spring spring-boot

我希望使用org.springframework.context.annotation.Condition接口在启动时禁用/启用我的一些@Configuration类。示例如下:

public class Condition implements ConfigurationCondition {

    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //Gets the configuration manager from the context
        RapidConfDocConfiguration.DocConf docConf = context.getBeanFactory().getBean(DocConf.class);

        return docConf.isEnabled();
    }
}

@Configuration
public class ConfDocConfiguration {

    @Bean
    public DocConf docConf() {
        return new DocConf(true);
    }
}

@Configuration
@Import(ConfDocConfiguration.class)
@Conditional({Condition.class})
public class RapidSwaggerConfiguration {
    //Some configurations
}

我在这里遇到的问题是在实例化任何上下文之前执行Condition,然后'DocConf'还没有出现。如果我读取环境变量或类似的东西,条件运行良好。

那么,是否可以使用基于上下文的spring bean的这种条件?

1 个答案:

答案 0 :(得分:2)

这是不可能的,因为您的DocConf类未作为配置加载,所有配置完成后都会创建@Bean注释bean。

为了实现这一点,您的DocConf类必须作为Spring配置添加到上下文中,因此通过@Bean从其他配置中包含它不起作用,因为非配置Bean仅在配置阶段之后创建。

考虑这篇文章:http://www.javarticles.com/2016/01/spring-configuration-condition-example.html

http://javapapers.com/spring/spring-conditional-annotation/

的另一个例子