我有点在创建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真正找到问题的解决方案,但也许我只是得到了错误的搜索词。或者我解决这个问题的方法完全错了(也许很愚蠢),没有人会在春季启动时解决它,而是坚持工厂。
感谢您的帮助!
答案 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...
}
}