10

非 Bean オブジェクトから Spring アプリケーション コンテキストを取得する必要があります。SO の別のスレッドでは、受け入れられた回答は、シングルトンを使用してアプリケーション コンテキストを取得することを提案しています。 Spring アプリケーション コンテキストの取得

しかし、シングルトンを使用すると、コードがより結合され、テストしにくくなります。これは、多くのスレッドで議論されている通常の問題です (例:シングルトンの何が悪いのか)

質問は、シングルトンを使用せずに非 Bean オブジェクトからアプリケーション コンテキストを取得するエレガントな方法はありますか?

4

2 に答える 2

8

あなたの問題は、私が数日前に経験したのとほぼ同じだと思います。私は次のことがあなたのために働くべきだと思います:

まず、AppContextManager以下のようなクラスを作成します。

@Component
public class AppContextManager implements ApplicationContextAware{
    private static ApplicationContext _appCtx;

    @Override
    public void setApplicationContext(ApplicationContext ctx){
         _appCtx = ctx;
    }

    public static ApplicationContext getAppContext(){
        return _appCtx;
    } 
}

で上記のクラスに注釈@Componentを付けるか、AppContextManager の Bean を宣言しますapplication context xml

non-singleton non-springインスタンスで次のコード スニペットを使用して、他の Spring Bean を取得します。

ApplicationContext ctx = ApplicationContextManager.getAppContext();
SomeSpringBean bean = ctx.getBean(SomeSpringBean.class);

これにより、コード内の任意の場所に Bean インスタンスが表示されます。

于 2012-10-10T08:58:37.593 に答える
8

ブートストラップの問題は常にあります。Web アプリケーションの場合、通常、状況を処理する外側のサーブレット フィルターがあります。

Web アプリでない場合、ある種の外部シングルトンまたはブートストラップを回避する方法はありません。しかし; ここでシングルトンを使用すると、その単一のブートストラップ クラスのテスト可能性にのみ影響するはずです。明示的な方法でコンテナーを参照する必要があるコード内の場所は、実際にはごくわずかであるべきです。したがって、カップリングが大幅に増加することはありません。

言い換えれば、Spring コンテナーにアクセスする必要がある非 Bean オブジェクトは、実際にはごくわずかしかないはずです。そうでない場合は、おそらく spring を最適に使用していません。そして、コンテナを必要とするもののほとんど/すべては、おそらくBeanFactoryAwareまたはApplicationContextAwareを実装する必要があります

于 2009-01-24T09:43:04.480 に答える