CGLib代理
何为CGLib ,百度百科给出了解释如下:
Spring框架,如果类实现了接口,就使用JDK的动态代理生成代理对象,如果这个类没有实现任何接口,使用CGLIB生成代理对象.JDk强制要求必须有接口来实现动态代理,然而CGLib代理不需要必须有接口才能实现代理,而是通过一种类似“继承”的关系来实现代理的。
JDK动态代理小案例博客地址: http://www.cnblogs.com/zhanghaoliang/p/6475636.html
ProductDao被代理的类,CGLibproxy代理类,CGLibTest测试类
想要使用CGLib要先下载CGLib的jar包,但是Spring核心包(core包)已经集成了CGLib,Spring开发下不用导入专门的CGLib的包。
ProductDao要被代理的类
public class ProductDao { public void add() { System.out.println("添加商品"); } public void update() { System.out.println("修改商品"); } }
CGLibproxy
public class CGLibproxy implements MethodInterceptor { private ProductDao productDao; public CGLibproxy(ProductDao productDao) { super(); this.productDao = productDao; } // 使用CGLib生成代理 public ProductDao createProxy() { // 1.创建核心类 Enhancer enhancer = new Enhancer(); // 2.为其设置父类 enhancer.setSuperclass(productDao.getClass()); // 3.设置回调 enhancer.setCallback(this); // 4.创建代理 return (ProductDao) enhancer.create(); } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { if ("add".equals(method.getName())) { System.out.println("添加之前的操作。。。。。。"); Object object = methodProxy.invokeSuper(proxy, args); return object; } return methodProxy.invokeSuper(proxy, args); } }
CGlibTest 测试类
public class CGlibTest { @Test public void testDemo() { ProductDao productDao = new ProductDao(); ProductDao proxy = new CGLibproxy(productDao).createProxy(); proxy.add(); proxy.update(); } }
得出结果: