[转帖] spring AOP (6) 基础知识-cglib代理_Tomcat, WebLogic及J2EE讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Tomcat, WebLogic及J2EE讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3649 | 回复: 0   主题: [转帖] spring AOP (6) 基础知识-cglib代理        下一篇 
wangxilu
注册用户
等级:少校
经验:850
发帖:73
精华:3
注册:2013-4-10
状态:离线
发送短消息息给wangxilu 加好友    发送短消息息给wangxilu 发消息
发表于: IP:您无权察看 2013-4-10 16:21:58 | [全部帖] [楼主帖] 楼主

DK的动态代理只能针对接口来实现,由Proxy.newProxyInstance()第二个参数能很清楚地意识到这一点。面向接口编程肯定有它自己的好处,但是如果很小很小的一个项目,我们要对每个业务类创建一个接口,也并不一定是件好事吧。

如果不创建接口,而要实现代理,我们需要用到cglib,它是一个第三方的jar包,需要额外导入。

cglib采用非常底层的字节码技术,可以为代理对象创建一个子类,并且在子类中采用方法拦截的技术,拦截所有父类方法的调用,并且织入横切逻辑。

注意,既然是为父类创建一个子类,那么final修饰的方法是不能继承的,所以final修饰的方法是不会被织入横切逻辑的。

目标类:

Java代码  
北京联动北方科技有限公司

  1. package spring3.aop.aop4; 
  2. public class Target { 
  3.       
  4.        public void do1() { 
  5.              System.out.println("Target.do1()"); 
  6.        } 
  7.       
  8.        public void do2(String str) { 
  9.              System.out.println("Target.do2(" + str + ")"); 
  10.        } 
  11.       
  12.        public void exe1() { 
  13.              System.out.println("Target.exe1()"); 
  14.        } 
  15.       
  16.        public void exe2(String str) { 
  17.              System.out.println("Target.exe2(" + str + ")"); 
  18.        } 
  19.       
  20.        public final void exe3() { 
  21.              System.out.println("Target.exe3"); 
  22.        } 


    创建代理类 CglibProxy

Java代码  
北京联动北方科技有限公司

  1. package spring3.aop.aop4; 
  2. import java.lang.reflect.Method; 
  3. import net.sf.cglib.proxy.Enhancer; 
  4. import net.sf.cglib.proxy.MethodInterceptor; 
  5. import net.sf.cglib.proxy.MethodProxy; 
  6. public class CglibProxy implements MethodInterceptor { 
  7.       
  8.        private Enhancer enhancer = new Enhancer(); 
  9.       
  10.        public Object getProxy(Class<?> cls) { 
  11.              // 设定被代理类(目标类) 
  12.              enhancer.setSuperclass(cls); 
  13.              // 实例化代理类 
  14.              enhancer.setCallback(this); 
  15.              return enhancer.create(); 
  16.        } 
  17.       
  18.        @Override 
  19.        public Object intercept(Object obj, Method method, Object[] args, 
  20.        MethodProxy proxy) throws Throwable { 
  21.              System.out.println("----START----"); 
  22.              Object result = proxy.invokeSuper(obj, args); 
  23.              System.out.println("----END----"); 
  24.              return result; 
  25.        } 


    测试类:

Java代码  
北京联动北方科技有限公司

  1. package spring3.aop.aop4; 
  2. public class ProxyMain { 
  3.       
  4.        public static void main(String[] args) { 
  5.             
  6.              CglibProxy proxy = new CglibProxy(); 
  7.              Target childTarget = (Target) proxy.getProxy(Target.class); 
  8.              childTarget.do1(); 
  9.              childTarget.do2("test"); 
  10.              childTarget.exe1(); 
  11.              childTarget.exe2("test"); 
  12.              childTarget.exe3(); 
  13.        } 


    测试结果:

Java代码  
北京联动北方科技有限公司

  1. ----START----  
  2. Target.do1()  
  3. ----END----  
  4. ----START----  
  5. Target.do2(test)  
  6. ----END----  
  7. ----START----  
  8. Target.exe1()  
  9. ----END----  
  10. ----START----  
  11. Target.exe2(test)  
  12. ----END----  
  13. Target.exe3  


    这部分没有什么要讲的,大家知道就可以了。

注意,加载cglib时间比jdk的反射时间要长,如果应用中频繁的动态生成新的代理,不建议使用cglib,这个根据具体需求自己判断。

spring的aop是通过jdk动态代理或者cglib动态代理为目标bean织入横切逻辑的。




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论