spring中CGLIB代理(CGLIB字节码)

时间:2023-01-13 15:21:57

spring对AOP的支持-----知识点:

JDK的动态代理:主要是针对实现了接口的类生成代理 

CGLIB:是针对类生成代理,针对指定的类生成一个子类,覆盖里面的方法,所以指定的类不能是final包括方法

实例:目标对象

Java代码  spring中CGLIB代理(CGLIB字节码)
  1. package com.lovo.spring;  
  2.    
  3. public class UserManagerImpl {  
  4.   
  5.     public void addUser(String username, String password) {  
  6.             System.out.println("---------userManagerImpl.addUser()--------");  
  7.     }  
  8.   
  9.     public void deleteUser(int id) {  
  10.         System.out.println("---------userManagerImpl.deleteUser()--------");  
  11.   
  12.     }  
  13.   
  14.     public String findUserById(int id) {  
  15.     System.out.println("---------userManagerImpl.findUser()--------");  
  16.         return null;  
  17.     }  
  18.   
  19.     public void modifyUser(int id, String username, String password) {  
  20.     System.out.println("---------userManagerImpl.modifyUser()--------");  
  21.   
  22.     }  
  23. //private void checkSecurity(){  
  24. //  System.out.println("---------userManagerImpl.checkSecurity()--------");  
  25. //}  
  26. }  

 代理对象:

Java代码  spring中CGLIB代理(CGLIB字节码)
  1. package com.lovo.spring;  
  2.   
  3. import org.aspectj.lang.JoinPoint;  
  4.   
  5.   
  6.   
  7. public class SecurityHandler {  
  8.   
  9.     private void checkSecurity(){  
  10.   
  11.         System.out.println("---------------------------checkSecurity222222222222222");  
  12.       
  13.       
  14.     }  
  15.   
  16. }  

 

applicationContext.xml配置文件:

Java代码  spring中CGLIB代理(CGLIB字节码)
  1. <!--     可以不配置:spring会用到CGLIB库,但是必须导入库  
  2.   
  3. <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>  
  4. -->  
  5.     <bean id="securityHandler" clss="com.lovo.spring.SecurityHandler"/>             
  6.       
  7.     <bean id="userManager" class="com.lovo.spring.UserManagerImpl"/>  
  8. <aop:config>  
  9.     <aop:aspect id="myAspect" ref="securityHandler">  
  10.             <aop:pointcut id="allAddMethod" expression="execution(* com.lovo.spring.UserManagerImpl.add*(..))"/>  
  11.             <aop:before method="checkSecurity" pointcut-ref="allAddMethod"/>  
  12.     </aop:aspect>  
  13.   
  14. </aop:config>  

 1:如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP

2:目标对象实现了接口,可以强制使用CGLIB实现AOP

3:如目标对象没有实现接口,必须采用CGLIB库,spirng会自动在JDK动态代理和CGLIB之间转换

测试类:

Java代码  spring中CGLIB代理(CGLIB字节码)
  1. package com.lovo.spring;  
  2.   
  3. import org.springframework.beans.factory.BeanFactory;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5.   
  6. public class ClientTest {  
  7.   
  8.     /** 
  9.      * @param args 
  10.      */  
  11.     public static void main(String[] args) {  
  12.     /**1111*/BeanFactory bf = new ClassPathXmlApplicationContext("applicationContext.xml");  
  13.     UserManagerImpl userManager =  (UserManagerImpl) bf.getBean("userManager");  
  14.         userManager.addUser("aa""aa");  
  15. //      userManager.deleteUser(2);  
  16.       
  17.     }  
  18.   
  19. }  

 

在这里:可以在111处采用断点:可以看到userManager对象是一个CGLIB代理,

userManagerImp1$$EnhancerByCGLIB$$..........

如果是实现了接口的JDK动态代理的话:

这里的userManager就是:$Proxy0