use*_*406 5 spring spring-boot
以下2个bean声明之间有什么区别吗?
@Bean(name = "bean1")
public A getA() {
return new A();
}
@Bean
@Qualifier("bean1")
public A getA() {
return new A();
}
Run Code Online (Sandbox Code Playgroud)
两者都可以使用自动装配 @Qualifier
@Autowire
public void test(@Qualifier("bean1") A a) {
...
}
Run Code Online (Sandbox Code Playgroud)
Pat*_*die 11
是的,有区别:@Bean("foo")( 或@Component("foo")) 在 Spring 上下文中为您的 bean 指定名称“foo”,而@Qualifier("foo")仅添加信息而不更改 bean 的名称。
由于 bean 名称是 Context 中 bean 的唯一标识符,因此您只能有 1 个名为“foo”的 bean,而您可以有多个以@Qualifier("foo").
例子:
interface TypeOne {}
Run Code Online (Sandbox Code Playgroud)
下面将添加一个名为“beanOne”的 bean,该 bean 由类名自动生成。
@Component // explicitly: @Component("beanOne")
class BeanOne implements TypeOne {
}
Run Code Online (Sandbox Code Playgroud)
与类中的以下声明相同@Configuration:
@Bean // explicitly: @Bean(name = "beanOne")
BeanOne beanOne() { return new BeanOne(); }
Run Code Online (Sandbox Code Playgroud)
下面将添加一个名为“beanTwo”的 bean 和另一个名为“beanThree”的 bean,并具有相同的限定符“beanQualifier”:
@Component
@Qualifier("beanQualifier")
class BeanTwo implements TypeOne { }
@Component
@Qualifier("beanQualifier")
class BeanThree implements TypeOne { }
Run Code Online (Sandbox Code Playgroud)
通过上述内容,您可以使用限定符自动装配:
@Autowired
@Qualifier("beanQualifier")
Map<String, TypeOne> typeOneMap;
Run Code Online (Sandbox Code Playgroud)
该映射将仅包含 2 个带有限定符“beanQualifier”的 bean。
{beanThree=BeanThree@9f674ac, beanTwo=BeanTwo@1da4b3f9}
Run Code Online (Sandbox Code Playgroud)
另一个“beanOne”尚未连接到映射中,因为它未通过“beanQualifier”限定。
请注意,映射键是自动生成的 bean 名称。
value()您不必指定属性名称,例如@Qualifier("bean1"). 由于 Spring 的自定义注释,属性name()引用相同的值,因此它们只是具有相同行为的不同名称。value()@AliasFor(..)
| 归档时间: |
|
| 查看次数: |
3825 次 |
| 最近记录: |