7

春に cglib プロキシを使用すると、次のことが発生します。

a) コンストラクターの二重呼び出し

b) 別のメソッドから呼び出されたメソッドをインターセプトすることを許可しない

しかし、なぜ spring は Bean を作成してからプロキシを作成するのでしょうか? 指定された Bean クラスを拡張するクラスを動的に生成し、コンストラクターを 1 回だけ呼び出すことは可能ですか? これにより、パブリックおよび保護されたメソッドの a) および b) が解決されます。私は何かを逃していますか?

4

1 に答える 1

4

良い質問。これは、Springがアプリケーションコンテキストをブートストラップする方法によるものだと思います。最初にすべてのraw Beanを作成し、次にAOP(トランザクションを含む)の追加などのポストプロセッサを適用します。この階層化アーキテクチャでは、最初に通常のBeanを作成してから、それをラップする必要があります。このアプローチは、継承の原則よりも構成に従うと主張する人もいるかもしれません。

また、a)は問題にならないことに注意してください。クラスはコンストラクターではなく、@PostConstructメソッドで初期化を実行する必要があります。これは1回だけ呼び出されます。一方、これは別の問題につながります。

c)CGLIBプロキシでコンストラクタインジェクションを使用することはできません。SPR -3150を参照してください。

しかし、私はあなたの欲求不満を理解しています。唯一の有効な回避策は、AspectJの完全な織り方だと思います。

于 2012-10-20T11:05:24.247 に答える