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

提供单个@Bean,可用于注入多个接口

  •  0
  • LIvanov  · 技术社区  · 8 年前

    考虑以下代码

    public interface Iface1 { }
    public interface Iface2 { }
    
    public class A implements Iface1, Iface2 {
    
    }
    
    @Configuration
    public class AutoConfig {
    
      @Bean
      Iface1 provideIface1Impl() {
          return new A();  // instance no 1234
      }
    
      @Bean
      @ConditionalOnBean(A.class)
      @Autowired
      Iface2 provideIface2Impl(A aImpl) {
        return aImpl;
      }
    }
    

    我想要第二个 @Bean 方法与第一个(1234)中的实例自动连接,我想要第二个 @豆子 方法返回相同的实例,以便我可以为的客户端使用相同的实例 Iface1 和 Iface2 .

    目前的问题是,spring第二次不运行 @豆子 因为没有 @豆子 类型 A.class -创建的bean被视为 Iface1 即使它是类型 A .

    3 回复  |  直到 8 年前
        1
  •  2
  •   Gorazd Rebolj    8 年前

    只需定义bean A。当注入IFace1和Iface2时,它们将自动解析为A(当然,如果A是唯一的实现)。

    @Bean
    public A a() {
        return new A();
    }
    
        2
  •  0
  •   Mykola Yashchenko    8 年前

    我认为你应该试着只定义一个 @Bean . 它将创建一个单例:

    @Bean
    public A a() {
          return new A();
    }
    

    然后只需在 @Qualifier 注释:

    @Autowired
    @Qualifier("a")
    private Iface1 iface1;
    
    @Autowired
    @Qualifier("a")
    private Iface2 iface2;
    
        3
  •  0
  •   Yoory N. jmcg    8 年前

    除了其他人已经回答的问题外,我还想讨论这个问题中涉及bean依赖关系的部分。 将依赖项注入到 @Bean -注释方法,有两种方式:

    两者的示例:

    @Configuration
    public class AppConfig {
    
        @Bean
        public Foo foo() {
            return new Foo();
        }
    
        @Bean
        public Bar bar() {
            return new Bar(foo());
        }
    
        @Bean
        public Baz baz(Foo foo) {
            return new Baz(foo);
        }
    }
    

    因此,您的ProvideFace2Impl可以如下所示:

    @Bean
    Iface2 provideIface2Impl(A aImpl) {
        return aImpl;
    }
    
    // or...
    
    @Bean
    Iface2 provideIface2Impl() {
        return (Iface2)provideIface1Impl();
    }
    

    但不要这样使用 ,它会导致一些微妙的错误,比如双重代理或“无唯一类型的bean”错误等 Gorazd 建议。

    推荐文章