码迷,mamicode.com
首页 > 编程语言 > 详细

【转】spring的AOP动态代理--JDK代理和CGLIB代理

时间:2018-05-01 20:27:00      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:不能被继承   特殊情况   targe   http   article   --   不能   自己的   ips   

 
 
大家都知道AOP使用了代理模式,本文主要介绍两个代理模式怎么设置以及区别,对原文一些内容进行了引用后加入了自己的理解和更深入的阐述:
 
一、JDK代理和CGLIB代理的底层实现区别
* JDK代理只能针对实现了接口的类以反射的方式生成代理,而不能针对类 ,所以也叫“接口代理”
* CGLIB是针对类实现代理的,主要对指定的类以字节码转换的方式(ASM框架)生成一个子类,并重写其中的方法。 
【注意】:  有两种特殊情况,static与final方法:
    
 

Final方法

Static方法

Jdk代理

接口无法使用final关键字,所以不能用。

【报错】

接口方法使用了static后代理对象将无法访问此方法,所以不能用。

【报错】

Cglib代理

父类方法使用了final之后,子类将无法对其进行重写,无法拦截。

【不报错,但不拦截】

父类方法使用了static之后,子类将无法对其进行重写,无法拦截。

【不报错,但不拦截】

同时,当使用cglib代理的时候,目标类一定不能为final类(不能被继承),否则报错。  
 
以上可以看出使用代理的时候,尽量不要使用final和static关键字
 
 
二、Spring中两个模式的调配:
1、如果目标对象实现了接口,默认会采用JDK的动态代理机制实现AOP但是可以强制使用CGLIB实现AOP 
2、如果目标对象没有实现接口,必须使用CGLIB生成代理,spring会自动在CGLIB和JDK动态代理之间切换 。

3.如何强制使用CGLIB生成代理? 
* 添加CGLIB库,<SPRING_HOME>/lib/cglib/*.jar (其实Spring的核心包包括了cglib-nodep-2.2.jar,或者用MyEclipse构建项目也会自动引入
* 在spring的配置文件中加入: 
<aop:aspectj-autoproxy proxy-target-class="true"/> 

 

 

【转】spring的AOP动态代理--JDK代理和CGLIB代理

标签:不能被继承   特殊情况   targe   http   article   --   不能   自己的   ips   

原文地址:https://www.cnblogs.com/Xieyang-blog/p/8976717.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!