javaweb中CGLIB动态代理

阅读上一篇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代理所实现的效果相同,增强核心业务代码块(上面的目标类) ,只是代理的方式不同。

发布了80 篇原创文章 · 获赞 15 · 访问量 1868

猜你喜欢

转载自blog.csdn.net/weixin_43319279/article/details/103135053