按名称自动装配弹簧

时间:2018-10-20 04:37:47

标签: java spring

考虑一下,我想按名称自动装配bean。

示例界面:

@FunctionalInterface
private interface TestQualifier {
    void test();
}

在定义我的bean时,我有两个选择。

选项1:

@Qualifier定义之上使用@Bean

@Configuration
public class QualifierConfig {

    @Bean()
    @Qualifier("first")
    public TestQualifier first() {
        return () -> System.out.println("first");
    }

    @Bean()
    @Qualifier("second")
    public TestQualifier second() {
        return () -> System.out.println("second");
    }

}

选项2:

使用name批注的@Bean参数。

@Configuration
public class QualifierConfig {

    @Bean(name = "first")
    public TestQualifier first() {
        return () -> System.out.println("first");
    }

    @Bean(name = "second")
    public TestQualifier second() {
        return () -> System.out.println("second");
    }

}

在两种情况下,我都可以按名称自动接线。调用testAutowiring()方法会产生预期的结果。

@Component
public class MyComponent {

    @Autowired
    @Qualifier("first")
    private TestQualifier first;

    @Autowired
    @Qualifier("second")
    private TestQualifier second;

    public void testAutowiring() {
        first.test();
        second.test();
    }

}

输出:

  

第一

     

我的问题是:

  1. 在定义将按名称自动装配的bean时,建议使用哪种方法?
  2. 一种方法比另一种方法有什么优势,还是完全出于口味问题?

谢谢!

1 个答案:

答案 0 :(得分:1)

我会使用@Bean注释:

1。它是更强大的。如果同时添加@Bean("abc")@Qualifier("b"),则“ abc”名称将获胜。

2。您可以为同一个bean添加多个bean标识符。 @Qualifier没有此属性。

示例:

@Bean({"ab", "bc"})
public MyBean myBean() {
  return new MyBean();
}

在这种情况下,可以同时使用限定符“ ab”和“ bc”来访问bean。

3。@Qualifier的主要目的是识别bean,@Bean的主要目的是构造和初始化bean(包括其标识符)。