1

私はSpring Beanと呼んExecutorでいます.このエグゼキュータを2つのクラスに注入する必要があります.1つはセッションスコープで、もう1つはシングルトンです.したがって、@Autowiredアノテーションを使用して両方に注入します.非常にうまく機能します.しかし、セッションビーンの場合、エグゼキュータは1つだけです.すべてのセッションで、これがどのように機能するかを理解しています。

エグゼキュータに、注入された Bean のスコープを取得させるにはどうすればよいですか? 今できることは、それぞれに 2 つの異なるクラスを使用することだけです。

scoped-proxyそして、属性を <context-component-scan />に設定することの効果を本当に理解できませんtargetClass

編集

これがプロトタイプスコープの私の試みです:

これが私のセッション soped Bean だとします。

    @Component
    @Scope("session")
    public class WebExecutor(){

       @Autowired
       private ExecutorService executor;

       @Async
       public void startCalc(){
          executor.start("now");
       }

   }

そして、これは私の ExecutorService クラスです

@Component
@Scope("prototype")
public class ExecutorService{

    private int progress;

    public void start(String when){
       //do some stuff and increment the progress
    }

    //getter and setter for progress
}

また、エグゼキュータも自動配線するデフォルトのシングルトンスコープを持つ別のコンポーネントがあるため、エグゼキュータをセッションスコープにすることはできません。

これで、自動配線されている Bean のスコープを持つために必要な 1 つのクラスができたので、プロトタイプ スコープを試しました。

これがWeb版でどのように機能するかは次のようになります

  1. メソッド start を呼び出す実行を開始するリンクをクリックすると、WebExecutor
  2. 次に、WebParser を使用して ExecutorService から進行状況を取得し、それをユーザーに渡して進行状況を報告します。

これはプロトタイプの前はうまく機能していましたが、ExecutorService はすべてのセッションに対して 1 つでした。

そのため、プロトタイプを使用しましたが、現在は進行状況が常に 0 です。Executor をデバッグすると、増加していることがわかりましたが、どうやら WebExecutor は増加を認識できませんでした。

4

1 に答える 1

0

Uはprototypeスコープを使用できます。Executor次に、Bean の構築時に新しいインスタンスを注入します。そのため、 BeanExecutorの作成時にライフサイクルが開始されます。

scoped-proxy=target-classCGLIBBean のラッパーを作成します。したがって、他の Bean はこのラッパーへの参照のみを保持し、適切なスコープを持つ適切な Bean がこのラッパーに動的に注入されます。

つまり、おそらくセッションが作成されたときに注入された、非常に古い期限切れrequest scopedの Bean を Bean に保持していません。session scoped代わりに、新しいリクエストが作成されるたびに、現在のリクエストの新しい Bean が注入されます。このようにして、寿命の長い Bean から短い寿命の Bean にアクセスできます。つまり、request scopedBean からBean にアクセスできますsession scoped

于 2013-06-25T13:06:57.677 に答える