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