Springアレンジ13--面と向かって(AOP)3--CGLIBでAOPを実現


上記の2つのケースではAOPのターゲットオブジェクトであるUserManagerImplがインタフェースを実装していますが、インタフェースが実装されていない場合はどうすればいいのでしょうか.CGLIBを使用します.
AOPに対するspringのサポートのいくつかの状況を簡単に紹介します.
1.ターゲットオブジェクトにインタフェースが実装されている場合、デフォルトではJDKの動的エージェントを用いてAOPを実装する
2、ターゲットオブジェクトがインタフェースを実現した場合、CGLIBを強制的に使用してAOPを実現できる
3、ターゲットオブジェクトがインタフェースを実現していない場合、CGLIBライブラリを採用しなければならない場合、springは自動的にJDKダイナミックエージェントとCGLIBの間で変換する
CGLIBを強制的に使用してAOPを実現するにはどうすればいいですか?
*CGLIBライブラリ、SPRING_を追加HOME/cglib/*.jar
*springプロファイルにを追加
次に、CGLIBを使用する例を説明します.UserManagerImplとプロファイルを変更するだけです.コードは次のとおりです.
ターゲットオブジェクトUserManagerImplはインタフェースを実装しません:
public class UserManagerImpl {

    public void addUser(String username, String password) {

       System.out.println("----UserManagerImpl.addUser()----");

    }

    public void deleteUser(int id) {

       System.out.println("----UserManagerImpl.deleteUser()----");

    }

    public String findUserById(int id) {

       System.out.println("----UserManagerImpl.findUserById()--");

       return null;

    }

    public void modifyUser(int id, String username, String password) {

       System.out.println("----UserManagerImpl.modifyUser()----");

    }

  
applicationContext.xml
   
 <aop:aspectj-autoproxy proxy-target-class="true"/>

    <bean id="securityHandler" class="spring.SecurityHandler"/> 

    <bean id="userManager" class="spring.UserManagerImpl"/> 

    <aop:config>

       <aop:aspect id="security" ref="securityHandler">

           <aop:pointcut id="allAddMethod" expression="execution(* spring.UserManagerImpl.add*(..))"/>

           <aop:before method="checkSecurity" pointcut-ref="allAddMethod"/>

       </aop:aspect>x

    </aop:config> 


  
テストエンドコード:
public class Client {

    public static void main(String[] args) {

       BeanFactory factory = new 

ClassPathXmlApplicationContext("applicationContext.xml");

       UserManagerImpl userManager = 

(UserManagerImpl)factory.getBean("userManager");

       userManager.addUser("  ", "123");

    }

}


 
JDKダイナミックエージェントとCGLIBバイトコード生成の違いは?
*JDK動的エージェントは、インタフェースを実装したクラスに対してのみエージェントを生成でき、クラスに対しては生成できません.
*CGLIBはクラス実装エージェントであり、主に指定されたクラスに対してサブクラスを生成し、その中のメソッドを上書きする.継承であるため、このクラスまたはメソッドはfinalと宣言しないほうがよい.