我有一个配置类,它根据一个非常简单的条件注册bean(检查application.properties中的属性值)。配置类和条件如下:
@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
等)并且与 DBConfigComponents.class
位于同一文件夹中标记接口(interface)不被注册,这不会发生。无论条件是否满足,扫描到的 Bean 始终会被注册。
当我输入@Conditional(DatabaseConfigurationCondition.class)
时每个 @Component
带注释的类,比它正常工作,但我不想将它单独放在每个类上。
有什么建议吗?
最佳答案
幸运的是,我设法解决了这个问题。我的问题是,我在其他 Maven 模块的其他配置类中放置了另一个 @ComponentScan
注释 - 不以任何属性为条件。与DBConfigComponents
标记接口(interface)位于同一包中的组件实际上是由其他配置类扫描的。
@ComponentScan 的工作方式是在包级别。虽然,在不同的 Maven 模块中,两个配置类都在同一个包中。 @ComponentScan
与 @Conditional
完美配合。不需要将@Conditional单独放置在每个组件上。
关于Spring条件组件扫描配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51672677/