在运行时为接口创建bean实例

时间:2020-07-10 07:18:24

标签: java spring-boot

我有点在创建bean时遇到问题,或者我意图不对。.也许您可以帮助我解决问题:

我有一个可以接受批处理请求的应用程序。对于每一批,我都需要根据请求发出的参数创建自己的上下文。

我将尝试通过以下示例简单地对其进行介绍:

我收到要处理的FunctionA批处理请求,这是Function_I接口的实现,并且具有子实现FunctionA_DE和FunctionA_AT

类似这样的东西:

undefined

为FunctionA_DE创建一个实例以将其作为应用程序的调用部分的Function_I的方式进行启动的方式是什么,当我将具有FunctionB_DE / FunctionB_AT的FunctionB添加到类中时,它将是什么样子。

我认为可能是这样的:

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

我会通过将FunctionFactory自动装配到我的调用类中来调用它,并与

一起使用
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
   }
}

但是我无法弄清楚通过传递参数来为函数创建Prototype-Bean。而且我无法通过浏览SO真正找到问题的解决方案,但也许我只是得到了错误的搜索词。或者我解决这个问题的方法完全错了(也许很愚蠢),没有人会在春季启动时解决它,而是坚持工厂。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用Springs的应用程序上下文。为每个接口创建一个bean,但是用特定的配置文件对其进行注释,例如“功能-A-AT”。现在,当您必须调用它时,您可以简单地相应地设置spring的应用程序上下文,并且Spring应该使用正确的bean。

答案 1 :(得分:0)

大家好,感谢您阅读我的问题。

与一位精通Spring框架的朋友讨论之后,我得出的结论是,我的方法或我偏爱的解决方案不是我要寻找的,也不是应该如何使用Spring。由于Function_I-Instance取决于特定的批量加​​载配置的,因此不建议将所有这些实例都作为@Beans管理。

最后,我决定不使用spring管理我的Function_I的实例。但是相反,我构建了一个@ Controller-Class的Controller / Factory,并让此类使用传递的参数构建我需要的实例,以便在运行时进行决策。

这是它的外观(伪代码)

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