Создать экземпляр компонента во время выполнения для интерфейса - PullRequest
0 голосов
/ 10 июля 2020

Я как бы застрял на проблеме с созданием bean-компонентов, или, вероятно, у меня неправильное намерение ... Может, вы поможете мне решить эту проблему:

У меня есть приложение, которое принимает запросы на пакетную обработку. Для каждой партии мне нужно создать собственный контекст в зависимости от параметров, выдаваемых запросом.

Я попытаюсь просто проверить это следующим примером:

Я получаю запрос на обработку в batch FunctionA, который является реализацией моего интерфейса Function_I и имеет подреализацию FunctionA_DE и FunctionA_AT

Примерно так:

public interface Function_I {
   String doFunctionStuff()
}

public abstract class FunctionA implements Function_I {

   FunctionConfig funcConfig;

   public FunctionA(FunctionConfig funcConfig) {
      this.funcConfig = funcConfig;
   }

   public String doFunctionStuff() {
      // some code
      String result = callSpecificFunctionStuff();
      // more code
      return result;
   }

   protected abstract String callSpecificFunctionStuff();
}

public class FunctionA_DE extends FunctionA {
   public FunctionA_DE(FunctionConfig funcConf) {
      super(funcConf)
   }
   
   protected String callSpecifiFunctionStuff() {
      //do some specificStuff
      return result;
   }
}

public class FunctionA_AT extends FunctionA {
   public FunctionA_AT(FunctionConfig funcConf) {
      super(funcConf)
   }

   protected String callSpecifiFunctionStuff() {
      //do some specificStuff
      return result;
   }
}

каким будет Spring-Boot-Way создания экземпляра для FunctionA_DE, чтобы получить его как Function_I для вызывающей части приложения, и как он должен выглядеть, когда я добавляю FunctionB с FunctionB_DE / FunctionB_AT в свои классы ..

Я подумал, что это может быть что-то вроде:

PSEUDO CODE
@Configuration
public class FunctionFactory {
   @Bean(SCOPE=SCOPE_PROTOTYPE) // i need a new instance everytime i call it
   public Function_I createFunctionA(FunctionConfiguration funcConfig) {
      // create Function depending on the funcConfig so either FunctionA_DE or FunctionA_AT
   }
}

, и я бы назвал его, автоматически подключив FunctionFactory к моему вызывающему классу и используя его с

someSpringFactory.createFunction(functionConfiguration);

, но я не могу понять это, чтобы создать Prototype-Bean для функции с передачей параметр .. И я действительно не могу найти решение своего вопроса, просматривая SO, но, возможно, я только что получил неправильные поисковые запросы .. Или мой подход к решению этой проблемы, я совершенно неверен (может быть, глуп), никто не решит это методом весенней загрузки, но будет придерживаться фабрик.

Ценю вашу помощь!

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Всем привет и спасибо, что прочитали мой вопрос.

после обсуждения с другом, который хорошо разбирается в весенних фреймворках, я пришел к выводу, что мой подход или мое предпочтительное решение не то, что я искал для и не то, как следует использовать пружину. Поскольку Function_I-Instance зависит от указанной конфигурации c пакетной загрузки, не рекомендуется управлять всеми этими экземплярами как @ Beans.

В конце концов я решил не управлять экземплярами для моей Function_I с помощью весна. но вместо этого я создаю Controller / Factory, который является @ Controller-Class, и позволяю этому классу построить экземпляр, который мне нужен, с переданными параметрами для принятия решения во время выполнения.

Вот как это выглядит (Псевдокод)

@Controller
public class FunctionController {

   SomeSpringManagedClass ssmc;

   public FunctionController(@Autowired SomeSpringManagedClass ssmc) {
      this.ssmc = ssmc;
   }

   public Function_I createFunction(FunctionConfiguration funcConf) {
      boolean funcA, cntryDE;
      // code to decide the function
      if(funcA && cntryDE) {
         return new FunctionA_DE(funcConf);
      } else if(funB && cntryDE) {
         return new FunctionB_DE(funcConf);
      } // maybe more else if...
   }
}
0 голосов
/ 10 июля 2020

Вы можете использовать контекст приложения Springs. Создайте bean-компонент для каждого из интерфейсов, но аннотируйте его специальным профилем c, например «Function-A-AT». Теперь, когда вам нужно вызвать его, вы можете просто соответствующим образом установить контекст приложения Spring, и Spring должен использовать правильный bean-компонент.

...