package aop_cglib;
public class CglibDaoImpl {
public void save(){
System.out.println("保存。。");
}
public void update(){
System.out.println("更新。。");
}
}
package aop_cglib;
import java.lang.reflect.Method;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
public class CglibUtils {
public static <T> T getDao(T daoImpl){
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(daoImpl.getClass());
//设置回调函数
enhancer.setCallback(new MethodInterceptor() {
// 代理对象的方法执行 回调函数就会执行
@Override
public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable {
if(method.getName().contains("save")||method.getName().contains("update")||method.getName().contains("delete")){
System.out.println("打开事务");
}
// 执行原方法
methodProxy.invokeSuper(obj, args);
// method.invoke也可以完成方法的调用。。不知道有何区别
// method.invoke(daoImpl, args);
if(method.getName().contains("save")||method.getName().contains("update")||method.getName().contains("delete")){
System.out.println("关闭事务");
}
return null;
}
});
//生成代理对象
@SuppressWarnings("unchecked")
T proxy = (T) enhancer.create();
return proxy;
}
}
package aop_cglib;
import org.junit.Test;
public class TestAopCglib {
@Test
public void testCglib(){
// 代理前
CglibDaoImpl dao = new CglibDaoImpl();
dao.save();
dao.update();
System.out.println("=============");
// 代理后
CglibDaoImpl proxy = CglibUtils.getDao(dao);
proxy.save();
proxy.update();
}
}
输出:
保存。。
更新。。
=============
打开事务
保存。。
关闭事务
打开事务
更新。。
关闭事务