CGLIB动态代理:基于ASM机制实现,通过生成业务类的子类作为代理类
所用从上面可以知道CGLIB也不能代理private方法,也为CGLIB是要生产你的业务类的子类作为代理类,一旦你的业务类中的方法有private的话,代理类就不能继承业务类,也就是不能进行增强,不能进行代理
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
从这我们也知道了CGLIB可以代理类了,CGLIB通过生成业务类的子类作为代理类,子类的话肯定是通过继承实现的,所以就没有单继承的限制了,而不是向JDK的Proxy那样只能代理接口的了,
Enhancer是啥
cglib库的Enhancer在Spring AOP中作为一种生成代理的方式被广泛使用,Enhancer是cglib中使用频率很高的一个类,它是一个字节码增强器,可以用来为无接口的类创建代理。它的功能与java自带的Proxy类挺相似的。它会根据某个给定的类创建子类,并且所有非final的方法都带有回调钩子。
Enhancer 的作用
Enhancer 其被用于创建 Java 代理类,相较于 Java 标准库的 Proxy 类,它 特别地 ,能够支持那些没有实现接口的类的代理工作
建立要被增强的类
public class UserDao {
public void findAll(){
System.out.println("查找所有的用户");
}
public void findUserById(){
System.out.println("按照id查找");
}
}
建立增强方法
import java.lang.reflect.Method;
//回调方法
public class UserService implements MethodInterceptor {
/**
*
* @param obj 表示要进行增强的对象
* @param method 表示拦截的方法
* @param objects 数组表示参数列表,基本数据类型需要传入其包装类型,如int-->Integer、long-Long、double-->Double
* @param methodProxy 表示对方法的代理,invokeSuper方法表示对被代理对象方法的调用
* @return 执行结果
* @throws Throwable 异常
*/
@Override
public Object intercept(Object obj, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
// 注意这里是调用invokeSuper而不是invoke,否则死循环;
// methodProxy.invokeSuper执行的是原始类的方法;
// method.invoke执行的是子类的方法;
System.out.println("执行之前");;
Object result = methodProxy.invokeSuper(obj, objects);
System.out.println("执行之后");;
return result;
}
}
方法用途
public class UsrDaoMain {
public static void main(String[] args) {
// 通过CGLIB动态代理获取代理对象的过程
// 创建Enhancer对象,类似于JDK动态代理的Proxy类
Enhancer enhancer = new Enhancer();
// 设置目标类的字节码文件也就是要增强的类
enhancer.setSuperclass(UserDao.class);
// 设置回调函数
enhancer.setCallback(new UserService());
// create方法正式创建代理类
UserDao userDao = (UserDao) enhancer.create();
userDao.findAll();
userDao.findUserById();
}
}
输出
执行之前
查找所有的用户
执行之后
执行之前
按照id查找
执行之后