一、动态代理实现AOP的缺陷
在上一篇文章细说Spring——AOP详解(动态代理实现AOP)中讲解了如何使用动态代理实现AOP,虽然Java动态代理为我们提供了非常灵活的代理机制,但Java动态代理是基于接口的,如果目标对象没有实现接口我们该如何代理呢?这时候我们就需要使用CGLIB来实现AOP了。
二、CGLIB实现代理的原理
我们先创建一个目标对象
package demo1;
/**
* Created by Yifan Jia on 2018/6/9.
*/
public class SomeService {
public String doFirst() {
System.out.println("执行doFirst()方法");
return "abcde";
}
public void doSecond() {
System.out.println("doSecond()方法");
}
}
针对这个目标类,假如我们要使用动态代理实现AOP,那么我们只能在写一个增强的接口,然后让目标类实现增强接口,然后我们就可以使用动态代理实现目标类的增强,可是假如我们不想让目标类实现其他的接口,那么我们就只能使用CGLIB技术来实现目标类的增强了。
CGLIB实现目标类增强的原理是这样的:CGLIB会动态创建一个目标类的子类,然后返回该子类的对象,也就是增强对象,至于增强的逻辑则是在子类中完成的。我们知道子类要么和父类有一样的功能,要么就比父类功能强大,所以CGLIB是通过创建目标类的子类对象来实现增强的,所以:
目标子类 = 目标类 + 增强逻辑
至于CGLIB底层是如何动态的生成一个目