2011-11-01 10 views
5

私はSpring AOPで遊んでいます。ここで Spring AOPは余分なBeanを作成します

public class CModel extends Car { 
    private double torqueMeasure = 1; 

    public CModel() { 
     System.out.println(" C-Model constructor");   
    } 
} 

と春の構成は、今、この

<aop:config> 
    <aop:aspect ref="audit"> 
     <aop:before pointcut="execution(* com.test.main..*(..))" method="firstControl"/> 
      ... 
    </aop:aspect> 
</aop:config> 

オクラホマのようなものです単純なクラスです。 aop:configを追加してCModelをインターセプトすると、SpringはCModelのコンストラクタを2回呼び出します。つまり、Springは2つのCModelオブジェクトを作成します。

AOPの設定を削除すると、SpringはCModelオブジェクトを1つだけ作成します。

これはなぜこのような考えですか?

ありがとうございました。

+1

私は春がこの豆とプロキシを作成すると思う。動的プロキシクラスは基本クラスを拡張するので、そのコンストラクタでsuper()を呼び出す必要があります。スタックトレースをCModelコンストラクタで印刷して、新しいException()。printStackTrace()などのようにすることができます。 – svaor

答えて

5

私は確信していませんが、春は最初に通常のクラスをインスタンス化してから、サブクラスであるCGLIBプロキシを作成すると思います。初期化には、@PostConstructを使用する必要があります。これは一度使用することが保証されています。 、私の仮説を検証し、コンストラクタにブレークポイントを追加し、それが呼び出されたときに表示するには

- 倍の1それは春があなたのクラスへのプロキシを作成すると、それが使用されますCModel$EnhancedByCGLIB何か

+1

あなたは正しいと思います。私は実際に[最近](http://nurkiewicz.blogspot.com/2011/10/spring-pitfalls-proxying.html)についてブログを書いていますが、OPがそこに詳細を見つけるかもしれません。 BTWではこれを検証するもっと簡単な方法があります: 'System.out.println(this)' - 2行目に 'CModel $ EnhancedByCGLIB'のようなものがあります。 –

+3

これは[7.6プロキシメカニズム](http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying) – axtavt

3

後に右でなければなりませんCGLIBを使用して、CModelをサブクラス化するクラスを生成します。正味の影響はコンストラクタが2回呼び出されることです。詳細について春のドキュメント(特に第三弾)を

チェックイン: - とJDKのプロキシメカニズムあなたのクラスがインタフェースを実装している場合サイドノートとして http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying

、春には、JDKのプロキシメカニズムを使用しますあなたのコンストラクタを呼び出すことはありません。

+1

に記載されています私はパンチに殴られた:)重複した答えを申し訳ありません。 – wmkoch

関連する問題