2

シングルトンクラスの実装にオブジェクトを注入しようとしています。このようなもの

public class MyObjectWrapper implements ApplicationContextAware {

    public static MyObject myObject;
    private ApplicationContext ctxt;
    private MyObjectWrapper() {}

    public static synchronized MyObject getImpl() {
        if (myObject!=null)
            return myObject;

        MyObjectWrapper myObjectWrapper=new MyObjectWrapper();
        this.myObject = (MyObject) myObjectWrapper.getCtxt().getBean("myobject");
        return myObject;
    }

    @Override
    public void setApplicationContext(ApplicationContext arg0)
            throws BeansException {
        logger.debug("setApplicationContext - " + arg0);
        this.ctxt = arg0;
    }

    public ApplicationContext getCtxt() {
        return ctxt;
    }

    public void setCtxt(ApplicationContext ctxt) {
        this.ctxt = ctxt;
    }

}
  1. それは機能しません。つまり、MyObjectWrapper.getImpl()を呼び出すと、nullのMyObjectが取得されます。myobjectとMyObjectWrapperのBeanエントリがあります。

  2. getBeanの使用はベストプラクティスではないことは知っていますが、この特定の例では許容できますか?欠点は何ですか?ここにない場合は、Mainメソッドで同様のgetBean呼び出しを実行します。

メインメソッドでgetBeanを実行できます(そこでアプリケーションコンテキストにアクセスしています)が、このWrapperクラスがこのシングルトンの作成を担当するようにしたかっただけです。MyObjectを必要とするオブジェクトは、MyObjectWrapper.getImpl()を呼び出すだけで、シングルトンオブジェクトを取得できます。

同じことについてのフィードバックをいただければ幸いです。

4

1 に答える 1

5

MyWrapperObject静的メソッドでの新しいインスタンスをインスタンス化しているため、これは機能しませんgetInstance()。インスタンス化しているため、Bean はSpring で管理されていないため、メソッドApplicationContextAwaresetApplicationContext(...)Spring によって呼び出されません。

私はこのコードのファンではありませんが、このようなことをしたい場合は、提案があります. をインスタンス メンバーに保存する代わりにApplicationContext、静的メンバーに保存します。次に、静的getInstance()メソッドで、の新しいインスタンスを作成しないでください。インスタンスを作成する必要がMyWrapperObjectある静的を使用するだけです。このクラスが実際に Spring シングルトンである場合、心配する必要はありません。ApplicationContextMyObject

このようなもの:

public class MyObjectWrapper implements ApplicationContextAware {
    private static MyObject myObject;
    private static ApplicationContext ctxt;
    private MyObjectWrapper() {}

    public static synchronized MyObject getImpl() {
        if (myObject!=null)
            return myObject;

        this.myObject = ctxt.getBean("myobject", MyObject.class);
        return myObject;
    }

    @Override
    public void setApplicationContext(ApplicationContext arg0) throws BeansException {
        ctxt = arg0;
    }
}

また、オブジェクトを作成しないでくださいpublic。理由からシングルトンです。呼び出した全員がgetInstance()オブジェクトの同じインスタンスを取得する必要があります。にすればpublic、誰でもそれを手に入れ、必要に応じて再割り当てすることができます。それは目的をやや破ります...

于 2012-04-28T05:32:08.743 に答える