CGLIB代理
cglib和jdk代理对应,但是要实现jdk代理,其代理对象必须实现一个或多个接口,而cglib则不用实现接口,适用于没有实现接口的类的情况
cglib需要实现MethodInterceptor接口和实现intercept()方法
例如
需要增强的目标类UserDao
public class UserDao {
public void addUser(){
System.out.println("添加用户");
}
public void deleteUser(){
System.out.println("删除用户");
}
}
切面类
//切面类,用于增强UserDao
public class Myaspect {
public void addBefore(){
System.out.println("添加之前的检查");
}
public void deleteBefore(){
System.out.println("删除之前的检查");
}
}
代理类CglibProxy
public class CglibProxy implements MethodInterceptor {
public Object createProxy(Object target) {
//动态类对象
Enhancer enhancer = new Enhancer();
//确定需要增强的类,设置成它的父类
enhancer.setSuperclass(target.getClass());
//添加回调函数
enhancer.setCallback(this);
//返回创建的代理类
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
//创建切面类对象进行增强
Myaspect myaspect = new Myaspect();
myaspect.addBefore();
//执行目标方法
Object obj = methodProxy.invokeSuper(o, objects);
myaspect.deleteBefore();
return obj;
}
}
测试
public class CglibProxyTest {
public static void main(String[] args) {
//创建代理对象
CglibProxy cglibProxy = new CglibProxy();
//new userDao()表示目标对象
//获取增强后的目标对象
UserDao userDao = (UserDao) cglibProxy.createProxy(new UserDao());
//执行方法,此时方法已经被增强了
userDao.addUser();
}
}
结果
添加之前的检查
添加用户
删除之前的检查