阅读上一篇javaweb中Aop(jdk动态代理)https://blog.csdn.net/weixin_43319279/article/details/103125051
jdk的动态代理中 必须要实现一个或多个接口 !如果不希望实现接口 的步骤可以使用CGLIP代理。
CGLIP 是一个高性能开源的代码生成包,其低层是使用一个小而快的字节码处理框架asm
CGLIP在原来的jdk代理中,除去了接口和接口实现类!
CGLIP是通过asm包来实现的。
创建目标类
package com.CGLIPtest;
public class GoodsDao {
public void add(){
System.out.println("添加");
}
public void update(){
System.out.println("更新");
}
}
切面类
package com.CGLIPtest;
public class MyAspect {
public void myBefore() {
System.out.println("方法之前");
}
public void myAfter() {
System.out.println("方法之后");
}
}
代理类
(整合增强的代码块)
package com.CGLIPtest;
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 MyBeanFactory {
public static GoodsDao getBean() {
final GoodsDao goodsDao = new GoodsDao();
final MyAspect myAspect = new MyAspect();
// 生成代理类
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(goodsDao.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy)
throws Throwable {
// TODO 自动生成的方法存根
myAspect.myBefore();
Object obj = method.invoke(goodsDao, args);
myAspect.myAfter();
return obj;
}
});
GoodsDao goodsDaoProxy = (GoodsDao) enhancer.create();
return goodsDaoProxy;
}
}
测试类
package com.CGLIPtest;
public class CGLIPProxyTest {
public static void main(String[] args) {
GoodsDao goodsDao = MyBeanFactory.getBean();
goodsDao.add();
goodsDao.update();
}
}
运行的结果
总结:
与jdk动态代理相比 ,CGLIP与 JDK的代理类的作用大致相同(都是把切面类注入到程序中), jdk动态代理与CGLIP代理所实现的效果相同,增强核心业务代码块(上面的目标类) ,只是代理的方式不同。