Java 按名称排列的Spring autowire

Java 按名称排列的Spring autowire,java,spring,Java,Spring,考虑到我想按名称自动连接bean 示例界面: @FunctionalInterface private interface TestQualifier { void test(); } 定义bean时,我有两个选择 选项#1: @FunctionalInterface private interface TestQualifier { void test(); } 在@Bean定义上使用@Qualifier @Configuration public class Qualif

考虑到我想按名称自动连接bean

示例界面:

@FunctionalInterface
private interface TestQualifier {
    void test();
}
定义bean时,我有两个选择

选项#1:

@FunctionalInterface
private interface TestQualifier {
    void test();
}
@Bean
定义上使用
@Qualifier

@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:

@FunctionalInterface
private interface TestQualifier {
    void test();
}
使用
@Bean
注释的
name
参数

@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();
    }

}
输出:

首先

第二

我的问题是:

@FunctionalInterface
private interface TestQualifier {
    void test();
}
  • 在定义将按名称自动连接的bean时,建议采用哪种方法
  • 一种方法比另一种方法有任何优势吗,或者这完全是一种品味问题

  • 谢谢

    我会选择
    @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,包括它的标识符。

    通常当你想自动连接一个接口,并且你的应用程序上下文中有多个bean(即接口子项)时,使用
    @Qualifier
    。选项3:不要放任何东西,因为
    @bean(name)
    文档:如果未指定,则bean的名称是带注释方法的名称。如果指定,则忽略方法名称。“但不会这样做,名称应该是故意的。