1.静态代理和JDK代理模式都要求对象是实现一个接口,但是有目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理
2.Cglib代理也叫子类代理,它是在内存中构建一个子类对象从而实现对目标对象的功能扩展,有些书也将Cglib代理归属到动态代理。
3.Cglib是一个强大的高细性能的代码生成包,它可以在运行期扩展java类与实现java接口,它广泛的被许多AOP的框架使用,例如Spring AOP,实现方法拦截
4.在AOP编程中如何选择代理模式:
1)目标对象需要实现接口,用JDK代理
2)目标对象不需哟啊实现接口,用Cglib代理
5.Cglib包底层是通过使用资字节码处理框架ASM来转换字节码并生成新的类。
public class TeacherDao {
public void teach() {
System.out.println("老师授课中 , 我是cglib代理,不需要实现接口 ");
}
}
public class ProxyFactory implements MethodInterceptor {
//维护一个目标对象
private Object target;
//构造器,传入一个被代理的对象
public ProxyFactory(Object target) {
this.target = target;
}
//返回一个代理对象:是target对象的代理对象
public Object getProxyInstance(){
//1.创建一个工具类
Enhancer enhancer=new Enhancer();
//2.设置父类
enhancer.setSuperclass(target.getClass());
//3.设置回调函数
enhancer.setCallback(this);
//4.创建子类对象,即代理对象
return enhancer.create();
}
public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("Cglib代理模式~~开始");
Object returnValue = method.invoke(target, args);
System.out.println("Cglib代理提交~~开始");
return returnValue;
}
}
public class Client {
public static void main(String[] args) {
TeacherDao teacherDao=new TeacherDao();
ProxyFactory proxyFactory=new ProxyFactory(teacherDao);
TeacherDao proxyInstance = (TeacherDao)proxyFactory.getProxyInstance();
proxyInstance.teach();
}
}
总结:cglib基于继承,jdk代理模式基于接口