Spring @Bean(name ="name") vs @Bean @Qualifier("name")

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 名称。


夢のの*_*のの夢 9

value()您不必指定属性名称,例如@Qualifier("bean1"). 由于 Spring 的自定义注释,属性name()引用相同的值,因此它们只是具有相同行为的不同名称。value()@AliasFor(..)

  • 这真的回答了问题吗?唔 (8认同)