英文:
How to add @Qualifier
问题
怎样在这两个Bean之间添加限定符以进行区分?我知道我需要使用@Qualifier
注解,但不太确定如何将其添加到Beans中,然后如何创建带有对适当的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)
}
}
英文:
How can I add a qualifier to distinguish between these two beans? I know I need to use the @Qualifier annotation but I am not sure how to add it in the beans and then how to create the autowired object with reference to the appropriate 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)
}
}
答案1
得分: 1
你可以在进行Credentials的自动装配(Autowire)时,只需使用@Bean的名称添加@Qualifier。
@Autowired
@Qualifier("getCredentials")
Credentials credentials;
英文:
You could just add @Qualifier with bean name whenever you do an Autowire of Credentials.
@Autowired
@Qualifier("getCredentials")
Credentials credentials;
答案2
得分: 1
在这种情况下,我发现明确为我的 beans 指定名称是有益的,这样更清楚地知道我在选择哪个。否则,你最终会得到 Spring 决定的名称(基于方法名)。当我们想要注入一个 bean,但存在多个相同类型的 bean 时,我们在注入点使用 @Qualifier
注解,指定我们关心的 bean 的名称。
所以...
// 在 CredentialsConfig 中
@Bean("firstCredentials") fun firstCredentials(): Credentials = TODO()
@Bean("secondCredentials") fun secondCredentials(): Credentials = TODO()
当在这些中的一个中进行连接时,你可以添加一个 @Qualifier
来选择你想要的特定实现(注意,如果你使用构造函数注入,则不需要 @Autowired
):
@Component
class MyComponent(@Qualifier("firstCredentials") creds: Credentials) { ... }
英文:
In situations like this, I find it beneficial to explicitly name my beans so it is more clear which one I am picking. Otherwise, you will end up with what Spring decides to call it (based on the method name). When we want to inject a bean, but there are more than one of them, we use the @Qualifer
annotation at the injection point, specifying the name of the bean we care about.
So...
// In CredentialsConfig
@Bean("firstCredentials) fun firstCredentials(): Credentials = TODO()
@Bean("secondCredentials) fun secondCredentials(): Credentials = TODO()
And when wiring in one of these, you can add a @Qualifier
to pick your specific implementation (note, if you use constructor injection, you don't need @Autowired
):
@Component
class MyComponent(@Qualifier("firstCredentials") creds: Credentials) { ... }
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论