如何添加@Qualifier

How to add @Qualifier

如何添加限定符来区分这两个 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)
    }
}

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

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

在这种情况下,我发现明确命名我的 bean 是有益的,这样我选择的 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) { ... }