0

私は、すべて同じインターフェイスを実装するいくつかの SFSB を持つアプリケーションに取り組んでいます。

実行時にどの具体的な実装を使用するかを決定するために、次の Factory Method があります。

@SuppressWarnings("rawtypes")
@Inject @Any Instance<SFSBInterface> sfsbSource;

public <T> SFSBInterface<T> initBeanForm(Class<T> clazz, Class<? extends SFSBInterface<T>> sfsbClass, Annotation... qualifiers) {
    SFSBInterface<T> sfsb = sfsbSource.select(sfsbClass, qualifiers).get();
    return sfsb;
}

各具象実装には、@Remove アノテーション付きメソッドが実装されています。今、この sfsb を削除して、このメソッドを呼び出すときに新しいインスタンスを取得したい場合があります。

remove メソッドを呼び出して、このオブジェクトへのすべての参照を削除していますが、インスタンスは引き続きメモリ内に存在します。このクラスのインスタンスを要求すると、以前に削除を呼び出したのと同じインスタンスが取得されます。

私の質問は次のとおりです。

  1. remove メソッドを呼び出したこのインスタンスを使用すると、問題が発生しますか?
  2. 削除されたインスタンスがメモリに保持されるのは正常ですか?
  3. このインスタンスを効果的に削除するにはどうすればよいですか?
  4. クラスの実際の新しいインスタンスを取得するにはどうすればよいですか?

敬具クリスチャン

ところで:私はJBoss 7.1.1とWeldを使用しています

4

1 に答える 1

0

このクラスのインスタンスを要求すると、以前にremoveを呼び出したのと同じインスタンスを取得しています。

この動作は仕様を超えているため、ベンダーに大きく依存していると言えます。新しいBeanは、古いインスタンスのプールから取得することも(ここではそうなるようです)、新しく作成することもできます。この戦略は、(理論的には)アプリサーバーの新しいリリースによって変更される可能性があり、さらに悪いことに、環境ごとに変更される可能性があります。

中心的な問題は、それが「新しいインスタンス」であるとどのように判断するかです。

一緒に暮らせるかどうか答えるのは簡単ではないと思います。

次のステップとして行うべきことは、新しいBeanのライフサイクルフックを検査することです。すべてが呼び出され、すべての依存関係が正しく挿入されている場合、それはかなり良い私見に見えます。

それ以外の場合は、質問を更新してください:)

于 2012-06-13T07:17:11.480 に答える