代码之家  ›  专栏  ›  技术社区  ›  user10367961

弹簧自动接线(按名称)

  •  2
  • user10367961  · 技术社区  · 8 年前

    考虑到我想按名称自动连接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 的参数 @豆 注释。

    @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 回复  |  直到 8 年前
        1
  •  1
  •   Adina Rolea    8 年前

    我会去的 @Bean 注释:

    1.它是更强的。如果你两个都加上 @Bean("abc") 和 @Qualifier("b") “ABC”的名字会赢。

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

    例子:

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

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

    三。 @限定符 主要用于识别bean和 @比恩 主要目的是构造和初始化bean,包括它的标识符。