## 一,应用范围
1,如果目标对象实现了接口,在默认情况下会采用JDK的动态代理实现AOP
2,如果目标对象实现了接口,也可以强制使用CGLIB生成代理实现AOP
3,如果目标对象没有实现接口,必须引入CGLIB,Spring会在JDK的动态代理和CGLIB代理之间进行切换。
## 二,强制使用CGLIB代理
###1,引入CGLIB的Jar:
![](https://box.kancloud.cn/2016-03-02_56d6638062f35.jpg)
### 2,Spring配置文件中加入强制使用CGLIB代理
~~~
<!-- 强制使用CGLIB代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
~~~
## 三,小结
1, JDK的动态代理只能对实现了接口的类进行代理:
![](https://box.kancloud.cn/2016-03-02_56d663807168d.jpg)
如上图,如果要为UserManagerImpl生成代理,这种关系下,可以使用JDK的动态代理,也可以强制使用CGLIB进行代理。
但是如果我去掉实现关系:
![](https://box.kancloud.cn/2016-03-02_56d6638081996.jpg)
这时候就必须要使用CGLIB了。
另外,CGLIB在实现动态代理的时候,主要是为指定的类生成一个子类,例如,我要对上面的UserManagerImpl生成一个代理,会继承这个类,但是这个时候,如果我们把UserManagerImpl定义为final的,就无法被继承了,也就不能生成代理类了。所以,我们的Target object最好不要声明为final的。
- 前言
- Spring简化配置
- Spring中使用AspectJ实现AOP
- Spring中JDK的动态代理和CGLIB代理的区别
- Spring配置问题——元素 "context:component-scan" 的前缀 "context" 未绑定
- Hibernate中编程式事物的简单使用
- 使用Spring为Hibernate配置声明式事物
- Struts2+AJAX获取json数据
- 中间件概述
- EJB(Enterprise Java Bean)概述
- JBoss 6.1安装配置问题
- EJB对象的部署及客户端调用简单示例
- 有状态的EJB对象和无状态的EJB对象
- EJB远程调用和本地调用
- MyBatis——入门select