在另一个@Configuration类中使用@Configuration Bean的最佳实践

时间:2019-10-02 17:15:30

标签: java spring spring-boot

我必须使用我公司的现有库,该库在Spring项目的@Configuration中打包了一堆@Bean,但是将添加为我项目的依赖项。情况类似于

@Configuration
Class A{
 @Bean
  B b(){
   return new B()
 }
}



@Configuration
  Class C{ 
    @Bean
    D d(){
     D d = new D();
   //TODO: How do I use instance of B here
     d.someConfiguration(B b);
     return d;
   }
  }

我应该在C中使用new运算符来初始化A并调用方法b,还是应该直接在C中@Autowire B

2 个答案:

答案 0 :(得分:2)

您可以通过多种方式进行操作

通过字段自动布线

@Configuration
 Class C{ 

 @Autowire
 private B b;

     @Bean
     D d(){
       D d = new D();
       //TODO: How do I use instance of B here
      d.someConfiguration(B b);
      return d;
      }
  }

通过构造函数自动装配(我个人更喜欢使用构造函数自动装配,这将在测试案例中提供帮助)

@Configuration
 Class C{ 

 private B b;

  @Autowire
  public C(B b){
   this.b=b;
  }

     @Bean
     D d(){
       D d = new D();
       //TODO: How do I use instance of B here
      d.someConfiguration(B b);
      return d;
      }
  }

或者您也可以将其添加为spring可以解决的方法参数

 @Configuration
 Class C{ 

     @Bean
     D d(B b){
       D d = new D();
       //TODO: How do I use instance of B here
      d.someConfiguration(B b);
      return d;
      }
  }

答案 1 :(得分:1)

当您将库包含为依赖项时,springboot初始化时也会扫描这些库中的@Configuration文件。因此,在这些上下文中声明的bean在春季上下文中已经可用。

所以您可以做的只是将其作为方法参数

@Configuration
  Class C{ 
    @Bean
    D d(B b){
     D d = new D();
     d.someConfiguration(b);
     return d;
   }
}  

一旦spring看到您想要一个bean(如果键入B),它将搜索并给您一个实例。

我会说在春季使用new是邪恶的:)