Spring条件组件扫描配置

标签 spring spring-boot spring-bean spring-config component-scan

我有一个配置类,它根据一个非常简单的条件注册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/

相关文章:

java - 使用 Spring 从 XML 属性文件加载并注入(inject)属性 Bean

java - Spring 3 - 基于注解的 Bean 验证

java - Spring、JdbcTemplate不能使用Select List中未指定的Column吗?

spring - HibernateTemplate 类转换异常

java - Spring Boot 中的 SQL 注入(inject)预防

java - 如何获取 CrudRepository 实例?

performance - Grails - 在普通 Groovy 类中访问 Bean 的最佳方式

spring - 使用 Spring Logback 在不同路径配置 Kubernetes 日志

java - Spring AOP : Aspect not working on called method

spring - 如何在Spring中为多个数据源设置liquibase?