0

コードを Spring の XML 構成から Java 構成に移動しました。すべてが機能していますが、プロトタイプ Bean をどのように実装したかについて質問があります。なんとなく気持ち悪い!

私はこのようにBeanクラスを書きました:

@Component
@Scope("prototype")
public class ProtoBean {
    ...
}

次に、Bean を使用します。これは機能しますが、よくわからない部分です。

@Component
public class BeanUser implements ApplicationContextAware {
    ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext context)throws BeansException
    {
        this.context = context;
    }

    public void getProtoBean() {
         ProtoBean protoBean = context.getBean(ProtoBean.class);
    }
}

これにより、プロトタイプ化された Bean が得られます。単体テストでは、モックを使用して setApplicationContext と呼ばれるコンテキストをモックし、モックの getBean 呼び出しでモック ProtoBean を返すようにしました。だから、すべてが順調です。

ファクトリを使用して XML でこれを行いましたが、あまりうまくいかないようだったので、ここに行き着きました。しかし、コンテキストなしでこれを行う方法はありますか? それとももっと良い方法ですか?

ありがとう!

4

1 に答える 1

1

Spring XML と Java ベースの構成の問題ではないと思いますが、一致する依存関係の範囲の問題の 1 つです。Spring は、作成時にシングルトン スコープの Bean に対してのみ依存性注入を実行できるため、必要に応じてプロトタイプ スコープの Bean をルックアップする必要があります。もちろん、現在の bean-lookup アプローチは機能しますが、ApplicationContext への依存関係が作成されます。他にもいくつかの可能性を提案できますが、問題の根源は実際には ProtoBean の生成に関係するものであり、どのようなトレードオフを受け入れる必要があるかです。

BeanUser 自体をプロトタイプ スコープにすることができます。これにより、ProtoBean をメンバーとして配線できます。もちろん、BeanUser のクライアントでも同じ問題が発生するというトレードオフがありますが、問題にならない場合もあります。

もう 1 つのパスは、シングルトン スコープの ProtoBeanFactory のようなものを使用して ProtoBean インスタンスを提供し、ProtoBeanFactory 内で依存関係ルックアップを非表示にすることです。

最後に、スコープ付きプロキシ Bean を使用してファクトリを効果的に隠すことができます。これを行うために AOP を使用しており、あなたがどのような種類のブードゥー教を行っているかが他の人に常に明確であるとは限りません。XML<aop:scoped-proxy/>では、Bean 宣言で使用します。使用する注釈の場合:

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")
于 2013-07-18T22:50:04.537 に答える