Java Spring:如何管理动态工厂?
我想创建一个工厂,但使用Spring并不简单,我再一次迷失在空间中:p 这就是我想做的 我有一个抽象类,它实现了多个接口(Runnable和一些个人接口) 我有一些从这个抽象类扩展而来的类,我将它们称为:W,S&E:p 抽象属性(docUnit)的一些类称为:WD表示W,SD表示S,ED表示E:) 现在考虑一个参数,我想在我的主控制器中实例化这个好的类。我想要一个通用的代码,但考虑到良好的过程,使用特定的类 差不多吧Java Spring:如何管理动态工厂?,java,spring,factory-pattern,Java,Spring,Factory Pattern,我想创建一个工厂,但使用Spring并不简单,我再一次迷失在空间中:p 这就是我想做的 我有一个抽象类,它实现了多个接口(Runnable和一些个人接口) 我有一些从这个抽象类扩展而来的类,我将它们称为:W,S&E:p 抽象属性(docUnit)的一些类称为:WD表示W,SD表示S,ED表示E:) 现在考虑一个参数,我想在我的主控制器中实例化这个好的类。我想要一个通用的代码,但考虑到良好的过程,使用特定的类 差不多吧 @Component("mainVm") @Scope("prototype"
@Component("mainVm")
@Scope("prototype")
public class MainVm {
@Autowired
private DocManFactory docManFactory;
// ???
private AbstractDocMan docMan;
...
public void setProcess(String myProcess) {
docMan = docManFactory.getDocMan(myProcess);
}
}
目前,我有一个奇怪的工厂定义。这是可行的,但我认为这不是一个好的做法:
public class DocManFactory {
@Autowired
private S s;
@Autowired
private W w;
@Autowired
private E e;
@Autowired
private SD sd;
@Autowired
private WD wd;
@Autowired
private ED ed;
public AbstractDocMan getDocMan(String myProcess) {
AbstractDocMan adm = null;
if ("S".equals(myProcess)) {
s.setDocUnit(sd);
adm = s;
} else if ("W".equals(myProcess)) {
w.setDocUnit(wd);
adm = w;
} else if ("E".equals(myProcess)) {
e.setDocUnit(ed);
adm = e;
}
return adm;
}
}
所以我的问题是:
-如何在工厂中动态注入好的docUnit?因为这里所有的对象都是实例化的(s,e,w,sd,ed,wd)zzz
-有没有办法在主控制器中注释属性
那么…如何使用Spring(v3.1.1)创建一个好的工厂呢
谢谢。我认为泛型和映射是这里的解决方案 你的直觉是正确的:这个实现太脆弱了。从这个开始:
public DocManFactory {
// You can inject or hard wire these
private static final Map<String, AbstractDocMan> INSTANCES;
public static AbstractDocMan getDocMan(String processName, Process process) {
AbstractDocMan docMan = INSTANCES.get(processName);
process.setDocUnit(docMan);
return docMan;
}
}
publicdocmanfactory{
//你可以注射或硬接线
私有静态最终映射实例;
公共静态AbstractDocMan getDocMan(字符串进程名,进程进程){
AbstractDocMan-docMan=INSTANCES.get(processName);
过程。setDocUnit(docMan);
返回码头工人;
}
}
如果我假设的
过程
类不同,泛型可以有所帮助。我认为泛型和映射是这里的解决方案
你的直觉是正确的:这个实现太脆弱了。从这个开始:
public DocManFactory {
// You can inject or hard wire these
private static final Map<String, AbstractDocMan> INSTANCES;
public static AbstractDocMan getDocMan(String processName, Process process) {
AbstractDocMan docMan = INSTANCES.get(processName);
process.setDocUnit(docMan);
return docMan;
}
}
publicdocmanfactory{
//你可以注射或硬接线
私有静态最终映射实例;
公共静态AbstractDocMan getDocMan(字符串进程名,进程进程){
AbstractDocMan-docMan=INSTANCES.get(processName);
过程。setDocUnit(docMan);
返回码头工人;
}
}
如果我假设的
进程
类不同,那么泛型会有所帮助。为什么要为它们调用setDocUnit(…)?你可以让Spring将正确的docUnit注入到你的对象中。Tim是对的——Spring可以为你做更多。如果你需要一个工厂,那么你的工厂方法的签名可能会让你难以接线。如果只是public AbstractDocMan getDocMan(){…}
就更容易了,除了将DocUnit注入到好的DocMan中,我能做些什么来不实例化工厂中的所有DocMan?我仍在研究如何创建动态注入,以获得一个工厂模式,如…我没有找到一个优雅的方法:(为什么你调用setDocUnit(…)对于他们?你可以让Spring将正确的docUnit注入到你的对象中。Tim是对的-Spring可以为你做更多。如果你需要一个工厂,那么工厂方法的签名可能会使连接变得很困难。如果它只是public AbstractDocMan getDocMan(){…},那就更容易了
除了将DocUnit注入优秀的DocMan之外,我还能做些什么来不实例化工厂中的所有DocMan?我仍在研究如何创建动态注入,以获得工厂模式,如……我没有找到一种优雅的方法:(是否可以使用enum而不是map?是否可以使用enum而不是map?