Spring: Как создать два разных bean-компонента из одного и того же класса, используя аннотации? - PullRequest
0 голосов
/ 02 мая 2020

Допустим, у нас есть следующий класс:

public class Service {
    private String name;

    public Service(String name) {
        this.name = name;
    }

    /// other methods
}

Допустим, я хочу сгенерировать два разных компонента из одного класса. Если я использую xml, это очень просто:

<beans>
   <bean id="service1" class="Service">
      <constructor-arg value="first service" />
   </bean>
   <bean id="service2" class="Service">
      <constructor-arg value="second service" />
   </bean>
</beans>

Мой вопрос заключается в том, как его можно с помощью весенних аннотаций.

Редактировать: Ответ в этой ссылке не подходит к моему вопросу. В этой ссылке класс MySecondComponent генерируется дважды, но у него есть конструктор по умолчанию, и мы не передаем разные аргументы / зависимости для каждого экземпляра.

1 Ответ

0 голосов
/ 03 мая 2020

Это способ сделать то же самое в Java (начиная с пружины 3.x):

@Configuration
public class MySampleConfiguration {

   @Bean
   public Service service1() {
      return new Service("first service");
   }

   @Bean
   public Service service2() {
      return new Service("second service");
   }
}

Обновление 1

На основе OP комментарий:

Существуют разные варианты использования, некоторые требуют указания имен бинов, другие - нет.

Вариант использования 1:

Скажем, есть компонент, с которым нужно создать экземпляр, скажем, service1:

public class SampleBean {
    private final Service service;

    public SampleBean(Service service) {
       this.service = service;
    }
}

В идеале вы не хотите указывать квалификатор в коде класса SampleBean, потому что он вид убивает принцип внедрения зависимости до некоторой степени. Однако вы можете сделать это в конфигурации:

@Configuration
public class MySampleConfigurationWithQualifier {

    @Bean(name = "service1")
    public Service service1() {
       return new Service1("first service");
    }

    @Bean(name = "service2")
    public Service service2() {
       return new Service2("second service");
    }

    @Bean
    public SampleBean sampleBean(@Qualifier("service1") Service service) {
       return new SampleBean(service);
    }
}

Вариант использования 2:

Скажем, эти сервисы должны быть введены каким-то образом сбор (скажем, список) в другой компонент.

В этом случае нет необходимости указывать name атрибут

public class SampleBean2 {

   private final List<Service> services;

   public SampleBean2(List<Service> services) {
      this.services = services;
   }

   public void notifyOnSomeEvent(Event evt) {
      for(Service service : services) {
        service.notify(evt);
      }
   }
}

В этом случае конфигурация может выглядеть следующим образом:

@Configuration
public class MySampleConfigurationWithListInjection {

    @Bean(name = "service1")
    public Service service1() {
       return new Service1("first service");
    }

    @Bean(name = "service2")
    public Service service2() {
       return new Service2("second service");
    }

    @Bean
    public SampleBean2 sampleBean2(List<Service> services) {
       return new SampleBean2(services);
    }
}

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