【问题标题】:Spring Boot @Qualifier alone is not workingSpring Boot @Qualifier 单独不起作用
【发布时间】:2018-08-06 12:56:20
【问题描述】:

我正在尝试创建多个数据源。这就是我的配置类中的内容:如果我注释 @Primary 注释,它会引发异常并且应用程序没有启动,为什么单独使用 @Qualifier 不起作用?为什么要坚持将数据源设为主要数据源之一?

@Bean
//@Primary
@ConfigurationProperties(prefix="spring.datasource")
public DataSource fDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean
@ConfigurationProperties(prefix="spring.secondDatasource")
public DataSource sDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean
public JdbcTemplate jdbcTemplateOne(@Qualifier("fDataSource") DataSource ds) {
    return new JdbcTemplate(ds);
}

@Bean
public JdbcTemplate jdbcTemplateTwo(@Qualifier("sDataSource") DataSource ds ) {
    return new JdbcTemplate(ds);
}

我在控制台中看到以下内容:

考虑将其中一个 bean 标记为 @Primary,更新消费者 接受多个bean,或使用@Qualifier 来识别bean 应该吃掉的

【问题讨论】:

  • 您的代码看起来不错,顺便说一句,您确定 Qualifier 导入正确吗?
  • 你已经声明了两个 jdbctemplate bean。为它们添加@Qualifier。然后你有任何自动配置器bean(可能来自spring)试图使用数据源bean,附加完整的堆栈跟踪

标签: spring spring-boot datasource


【解决方案1】:

这是因为自动配置。 Spring(尤其是 spring-boot)旨在在非常常见的情况下使配置变得容易。在大多数情况下,您只需要一个数据源,或者您的数据源之一是主(主)。数据源的自动配置依赖于这个假设。

如果您有特殊的配置(或不是很常见)的要求,您需要手动进行这些配置,并且可能不使用“spring-boot”。但是这种方式很复杂。您可以在 spring 文档中进一步了解。

【讨论】:

    【解决方案2】:

    您可以将Qualifier 注释放在具有各自名称的每个数据源上,我想这应该可以解决它。

    @Bean
    @ConfigurationProperties(prefix="spring.datasource")
    @Qualifier("fDataSource")
    public DataSource fDataSource() {
      return DataSourceBuilder.create().build();
    }
    
    @Bean
    @ConfigurationProperties(prefix="spring.secondDatasource")
    @Qualifier("sDataSource")
    public DataSource sDataSource() {
      return DataSourceBuilder.create().build();
    }
    
    @Bean
    public JdbcTemplate jdbcTemplateOne(@Qualifier("fDataSource") DataSource ds) {
      return new JdbcTemplate(ds);
    }
    
    @Bean
    public JdbcTemplate jdbcTemplateTwo(@Qualifier("sDataSource") DataSource ds ) {
      return new JdbcTemplate(ds);
    }
    

    【讨论】:

    • 即使我们没有使用@Qualifier("fDataSource"),默认情况下一个名为fDataSource的数据源对象应该是可用的吧?
    • 是的,默认是 Autowire.BY_NAME,除非有名字冲突
    【解决方案3】:

    尝试禁用 spring 自动初始化。

    spring.datasource.initialize=false
    

    此外,我不确定您如何使用您的 jdbctemplate bean。由于您已经声明了其中两个,请为它们添加 @Primary 或添加 @Qualifier。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2017-05-15
      • 1970-01-01
      • 2015-07-07
      • 2017-05-04
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多