最近开发过程中,遇到一个问题。系统中有一个不能改动的方法,但是我想在方法执行前后记录各自记录一条日志到数据库,所以用了两天去学了一下Cglib的动态代理。也是所谓的AOP的一种方式吧。
动态代理的作用和意义:
在不改动原有代码的基础上,对某些方式插入一下前置或者后置的操作,如request之前,要记一下log。
准备工作,Cglib需要两个jar包的支持才能运行起来。
asm.jar
cglib.jar
CgLib的实现:
1. 做一个代理类,实现MethodInterceptor接口
public class DaoProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
public<T> Object getProxy(Class<T> clazz){
//指定要代理的类
enhancer.setSuperclass(clazz);
//指定回调函数
enhancer.setCallback(this);
//创建代理返回
return enhancer.create();
}
public Object intercept(Object obj, Method method, Object[] params,
MethodProxy proxy) throws Throwable {
System.out.println("前置代理.....");
//执行父类的方法,并得到结果
Object result = proxy.invokeSuper(obj, params);
System.out.println("后置代理.....");
return result;
}
}
2.做一个要被代理的Dao,也就是父类
public class UserDao {
public void add(){
System.out.println("add。。。。");
}
public void delete(){
System.out.println("delete。。。。");
}
}
3.测试代码。
现在我就希望不改动UserDao的情况下,在add和delete的前后各自打印一句话。
public static void main(String[] args) {
DaoProxy proxy = new DaoProxy();//通过代理得到UserDao
UserDao userDao = (UserDao) proxy.getProxy(UserDao.class);
userDao.add();
userDao.delete();
}