Лучшая практика использования компонента @Configuration в другом классе @Configuration - PullRequest
2 голосов
/ 02 октября 2019

Мне нужно работать с существующей библиотекой моей компании, в которой есть пакет @Bean, упакованный в проект @Configuration in Spring, но который будет добавлен в качестве зависимости для моего проекта. Ситуация будет похожа на

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

Должен ли я инициализировать A, используя новый оператор в C, и вызвать метод b, или я должен * @Autowire B в C напрямую.

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Есть несколько способов сделать это

По полю Autowiring

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

By constructor Autowiring (Лично я предпочитаю использовать конструкторАвтопроводка, которая будет полезна во время тестовых случаев)

@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 голос
/ 02 октября 2019

Когда вы включаете библиотеку с зависимостью, то при инициализации springboot она сканирует файлы @Configuration в этих библиотеках. Таким образом, бобы, объявленные в них, уже доступны в весеннем контексте.

Итак, вы можете просто включить его в качестве параметра метода

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

Как только Spring увидит, что вам нужен bean-компонент, тип B будет искать и выдавать вам экземпляр.

Я бы сказал, что зло использовать new весной:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...