【问题标题】:Working with @Qualifier in Kotlin functions在 Kotlin 函数中使用 @Qualifier
【发布时间】:2017-02-28 03:09:23
【问题描述】:

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

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

在 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)
    }
}

【问题讨论】:

    标签: spring spring-data kotlin


    【解决方案1】:

    在 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

    【讨论】:

    • 谢谢!是的,这里的例子只是我能想出的最简单的非特定人为的例子来展示我遇到的问题。我尝试在参数中使用@Qualifier 时收到的错误是“此注释不适用于目标'值参数'”。
    • 你一定是不小心导入了javax.inject.Qualifier注解,这样是不行的。需要导入org.springframework.beans.factory.annotation.Qualifier注解。
    猜你喜欢
    • 2018-07-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2018-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    相关资源
    最近更新 更多