【问题标题】:How to add @Qualifier如何添加@Qualifier
【发布时间】:2020-10-19 14:04:57
【问题描述】:

如何添加限定符来区分这两个 bean?我知道我需要使用 @Qualifier 注释,但我不确定如何将它添加到 bean 中,然后如何参考适当的 bean 创建自动装配对象。

@Configuration
@Slf4j
@PropertySources(PropertySource("classpath:application.properties"),
                 PropertySource(value = ["file:\${credentials.config}"]))
class CredentialsConfig(@Autowired private val env: Environment) {

    @Bean fun getCredentials(): Credentials? {
        val user: String = env.getRequiredProperty("user1")
        val pass: String = env.getRequiredProperty("pass1")
        return Credentials.info(user, pass)
    }

    @Bean fun getCredentials2(): Credentials {
        val user: String = env.getRequiredProperty("user2")
        val pass: String = env.getRequiredProperty("pass2")
        return Credentials.info(user, pass)
    }
}

【问题讨论】:

标签: java spring spring-boot kotlin configuration


【解决方案1】:

在这种情况下,我发现明确命名我的 bean 是有益的,这样我会更清楚地选择哪一个。否则,您最终会得到 Spring 决定调用它的内容(基于方法名称)。当我们想注入一个bean,但有多个bean时,我们在注入点使用@Qualifer注解,指定我们关心的bean的名称。

所以...

// In CredentialsConfig

@Bean("firstCredentials) fun firstCredentials(): Credentials = TODO()
@Bean("secondCredentials) fun secondCredentials(): Credentials = TODO()

当连接其中一个时,您可以添加@Qualifier 来选择您的具体实现(注意,如果您使用构造函数注入,则不需要@Autowired):

@Component
class MyComponent(@Qualifier("firstCredentials") creds: Credentials) { ... }

【讨论】:

    【解决方案2】:

    您可以在执行凭据自动装配时添加带有 bean 名称的 @Qualifier。

    @Autowired
    @Qualifier("getCredentials")
    Credentials credentials;
    

    【讨论】:

    • 我应该在 bean 声明上方添加什么? @Qualllifier 也是?
    • 您可以将 bean 命名为 @Bean("credentials1") 和 @Bean("credentials2")
    • 默认情况下,它将是方法名称,所以由你决定。我觉得给豆子起个好名字会更好
    猜你喜欢
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多