在Kotlin函数中使用@Qualifier

时间:2017-02-28 03:09:23

标签: spring spring-data kotlin

在Kotlin中,函数参数始终是阻止@Qualifier()在参数级别使用的值。

如果有人想在同一个应用程序中经常访问的不同数据库的配置类中创建多个DataSource,那么推荐的组织方式是什么?

在Kotlin中不允许执行以下在Java中相当常见的内容。

@Configuration
class DatabaseAdminConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.ds_admin")
    fun adminDataSource(): DataSource {
        return DataSourceBuilder.create().build()
    }

    @Bean
    fun adminJdbcTemplate(@Qualifier("adminDataSource") dsAdminDb: DataSource): JdbcTemplate {
        return JdbcTemplate(dsAdminDb)
    }

    @ConfigurationProperties(prefix = "spring.ds_widget")
    fun widgetDataSource(): DataSource {
        return DataSourceBuilder.create().build()
    }

    @Bean
    fun widgetJdbcTemplate(@Qualifier("widgetDataSource") widgetDataSource: DataSource): JdbcTemplate {
        return JdbcTemplate(widgetDataSource)
    }
}

1 个答案:

答案 0 :(得分:2)

不需要将相同类的依赖项注入需要Spring中的依赖项的方法中。您可以直接调用该方法。

@Configuration
class DatabaseAdminConfig {

    @Bean
    @ConfigurationProperties(prefix = "spring.ds_admin")
    fun adminDataSource() = DataSourceBuilder.create().build()

    @Bean
    fun adminJdbcTemplate() = JdbcTemplate(adminDataSource())

    @Bean
    @ConfigurationProperties(prefix = "spring.ds_widget")
    fun widgetDataSource() = DataSourceBuilder.create().build()

    @Bean
    fun widgetJdbcTemplate() = JdbcTemplate(widgetDataSource())
}

PS:函数表达式主体(如上所示)使Spring Configuration类看起来更简洁。

PPS:@Qualifier对我来说完全没问题。我刚试过它。

PPPS:为了完整性解决具体问题,正如我评论的那样:您必须意外导入javax.inject.Qualifier注释,这将无效。您需要导入有效的org.springframework.beans.factory.annotation.Qualifier