Могу ли я использовать пружинное внедрение зависимостей @Autowired для создания нескольких экземпляров класса? - PullRequest
0 голосов
/ 12 октября 2019

У меня есть класс пользовательского интерфейса vaadin с конструктором, принимающим 2 аргумента. Он строит простую линию с некоторыми полями, отображающими данные. В другом (родительском) интерфейсе я хочу внедрить этот первый пользовательский интерфейс несколько раз, в зависимости от данных, загруженных в родительский интерфейс. Итак, теперь у меня есть два вопроса:

  1. Могу ли я использовать аннотацию springs @Autowired для внедрения нескольких экземпляров пользовательского интерфейса в родительский интерфейс? Если да, как мне это сделать?
  2. Как передать аргументы конструктору моего @Autowired дочернего класса?

Я уже узнал, что должен аннотироватьконструктор моего дочернего класса с @Autowired.

Мой дочерний класс пользовательского интерфейса с конструктором (аннотированный @Autowired)

public class ChildUI {

   private String arg1;
   private String arg2;

   @Autowired
   public ChildUI(String arg1, String arg2){
      this.arg1 = arg1;
      this.arg2 = arg2;
   }

}

В моем родительском классе я хочу сделать что-то подобное(personList загружен из базы данных):

public class ParentUI {

   ...
   for(Person p : personList){
      //inject instance of ChildUI here and pass p.getLastName() to arg1 and p.getFirstName() to arg2
   }
   ...

}

Некоторое время я гуглил, но не смог найти то, что искал. Может быть, я просто не знаю, какие ключевые слова искать. Может быть, кто-то попытается объяснить, что делать?

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Я не уверен, что полностью понимаю, что вы спрашиваете, поэтому дайте мне знать, если это не то, что вы имели в виду.

Создание нескольких экземпляров вашего childUI: Это просто, создайте несколько bean-компонентов в вашем классе конфигурации:

@Configuration
public class ApplicationConfiguration {

  @Bean
  public ChildUI firstBean(){
    return new ChildUI(arg1,arg2);
  }

  @Bean
  public ChildUI secondBean(){
    return new ChildUI(otherArg1,otherArg2);
  }

  @Bean
  public ChildUI thirdBean(){
    return new ChildUI(arg1,arg2);
  }
}

несколько экземпляров, внедренных в другой компонент: если вы автоматически связываете набор (или список) типа вашего компонента, все экземпляры этого будут внедрены в него:

public class ParentUI {

  private final Set<ChildUI> children;

  @Autowired
  public ParentUI(Set<ChildUI> children) {
    this.childern = children;//this will contain all three beans
  }
}
1 голос
/ 12 октября 2019

Просто создайте ChildUI, как обычно,

  for(Person p : personList){
     ChildUI someChild=nChildUI(p.getLastName(),m.getFirstName());
   }
   ...

и сделайте что-нибудь с someChild

Или, если ChildUI добавили другие зависимости - сначала сделайте это прототипом. тогда

    @Autowire
    private ApplicationContext ctx;
....
      for(Person p : personList){
         ChildUI someChild=ctx.getBean(ChildUI.class,p.getLastName(),m.getFirstName());
       }
...