Q:SpringのAOPは、どのように達成することですか?
ソリューション:春AOP動的プロキシ主に二つの方法、JDKの動的プロキシとCGLIBダイナミックプロキシがあります。
JDK動的プロキシプロキシクラスは、反射により受信し、インタフェースを実装しなければならないプロキシクラスを要求します。
コアJDK動的プロキシは、のInvocationHandlerインタフェースとプロキシクラスです。
ターゲット・クラスがインタフェースを実装していない場合は、春AOPは、動的プロキシCGLIBのターゲットクラスを使用することを選択します。
CGLIB(コード生成ライブラリ)は、コード生成ライブラリは、実行時に動的に生成されたクラスのサブクラスであるクラスは次のようにマークされているので、もし、動的プロキシを行うには、継承CGLIBウェイを通じて、注意しています最終的に、それはダイナミックCGLIBエージェントのために使用することはできません。
Q:CGLIBダイナミック機能:Testクラスを変更せずに、単語を印刷した後、メソッドのターゲットの前に単語を印刷します。
パブリック クラス UserServiceImplは実装UserServiceの{ @Override 公共 ボイド(追加){ // TODO自動生成されたメソッドスタブ のSystem.out.printlnは( "--------------------追加します----------------------」); } }
ソリューション: パブリック クラス CglibProxy 実装MethodInterceptorの{ プライベートエンハンサーエンハンサー= 新新エンハンサー(); パブリックオブジェクトgetProxy(クラスclazzが){ // クラスを作成し設定するには、サブクラス化 enhancer.setSuperclass(clazz); enhancer.setCallback(これを); // 動的サブクラスのインスタンスバイトコード技術を作成 ETURN enhancer.create(); } // 実装インターフェース方法MethodInterceptorの パブリックオブジェクトインターセプト(オブジェクトobj、メソッド、メソッド、オブジェクト[]引数、MethodProxyプロキシ)はスローのThrowable { するSystem.out.printlnを(「事前剤」); // メソッド呼び出しプロキシクラスの親クラスによって オブジェクト結果= proxy.invokeSuper(OBJ、引数); のSystem.out.println(「リア剤」); 戻り値の結果; } } パブリック クラスDoCGLib { 公共 静的 ボイドメイン(文字列[]引数){ CglibProxyプロキシ = 新しい新しいCglibProxy(); // 方法サブクラス化することによってプロキシクラスを作成 UserServiceImpl proxyImp =(UserServiceImpl)proxy.getProxy(UserServiceImpl。クラス); proxyImp.add(); } }