1

ファクトリを作成したいのですが、Spring では簡単ではなく、スペースに迷いました :p

これが私がやりたいことです。

複数のインターフェイスを実装する抽象クラスがあります (Runnable およびいくつかの個人用インターフェイス)

public abstract class AbstractDocMan implements Runnable, DocMan {

    protected AbstractDocUnit docUnit;

    // some attributes

    // some getter & setter
}

この抽象クラスから拡張されたいくつかのクラスがあります。それらを次のように呼びます: W、S & E :p そして、Abstract 属性 (docUnit) のいくつかのクラス: W の場合は WD、S の場合は SD、E の場合は ED :)

パラメータを考えて、メイン コントローラで良いクラスをインスタンス化したいと思います。ジェネリックコードが欲しいのですが、良いプロセスを考慮して特定のクラスで作業しています。

そんな感じ。

@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) で良い工場を作る方法。

ありがとうございました。

4

1 に答える 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;
    }
}

Processジェネリックは、想定したクラスが異なる場合に役立ちます。

于 2012-12-06T18:41:29.800 に答える