Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring:如何管理动态工厂?_Java_Spring_Factory Pattern - Fatal编程技术网

Java Spring:如何管理动态工厂?

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"

我想创建一个工厂,但使用Spring并不简单,我再一次迷失在空间中:p

这就是我想做的

我有一个抽象类,它实现了多个接口(Runnable和一些个人接口)

我有一些从这个抽象类扩展而来的类,我将它们称为:W,S&E:p 抽象属性(docUnit)的一些类称为:WD表示W,SD表示S,ED表示E:)

现在考虑一个参数,我想在我的主控制器中实例化这个好的类。我想要一个通用的代码,但考虑到良好的过程,使用特定的类

差不多吧

@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?