【发布时间】:2019-01-11 08:24:21
【问题描述】:
我有一个配置类,它根据一个非常简单的条件(检查 application.properties 中的属性值)注册 bean。配置类和条件如下:
@Configuration
@Conditional(DatabaseConfigurationCondition.class)
@ComponentScan(basePackageClasses = DBConfigComponents.class)
public class DatabaseConfigurationLoader {
@Bean
public DatabaseConfigurationRepository databaseConfigurationRepository() {
return new DatabaseConfigurationRepository();
}
}
和
public class DatabaseConfigurationCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return conditionContext.getEnvironment().getProperty("configuration.type").contains("db");
}
}
除了在这个配置类中注册的 bean 之外,我还有组件扫描来扫描其他组件。当条件不满足时,我希望配置类中定义的 bean 不会被注册(恰好是这种情况),但我也希望其他类用 @Component(或@Repository, @Service, etc..) 和DBConfigComponents.class 标记接口在同一文件夹中,不被注册,这不会发生。无论条件是否满足,被扫描的 Bean 都会被注册。
当我将 @Conditional(DatabaseConfigurationCondition.class) 放在每个 @Component 带注释的类上时,它可以正常工作,但我不想将它分别放在每个类上。
有什么建议吗?
【问题讨论】:
标签: spring spring-boot spring-bean spring-config component-scan