spring的AOP(三)—-Cglib动态代理详解编程语言

CGLIB(CodeGenerationLibrary)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。
如果被代理目标对象,没有实现任何接口,不能用JDK动态代理使,就要选用Cglib 类库进行动态代理。

Cglib 使用原理流程 和 JDK代理 是类似的
其底层依赖一个工具类org.springframework.cglib.proxy.Enhancer和一个接口org.springframework.cglib.proxy.MethodInterceptor
通过对目标对象类创建子类,覆盖方法,实现代理增强

代码示例:
CglibProxyUtils.java

package com.my.cglibproxy; 
 
import java.lang.reflect.Method; 
 
import org.springframework.cglib.proxy.Enhancer; 
import org.springframework.cglib.proxy.MethodInterceptor; 
import org.springframework.cglib.proxy.MethodProxy; 
 
//cglib 创建代理 工具类 
public class CglibProxyUtils implements MethodInterceptor{ 
 
    // 目标对象 
    private Object target; 
 
    public CglibProxyUtils(Object target) { 
        this.target = target; 
    } 
 
    // 创建代理 
    public Object createProxy(){ 
        // 创建代理 工具类  
        Enhancer enhancer = new Enhancer(); 
        // 设置父类型Class  
        enhancer.setSuperclass(target.getClass()); 
        // 设置回调invocation对象 
        enhancer.setCallback(this); 
        // 创建代理 
        return enhancer.create(); 
    } 
 
    /* 
     * proxy 是代理对象 
     * method 是调用方法反射对象 
     * args 是调用方法参数 
     * methodProxy 是调用目标方法代理对象 ,用于调用父类的方法 
     *  
     */ 
    @Override 
    public Object intercept(Object proxy, Method method, Object[] args, 
            MethodProxy methodProxy) throws Throwable { 
        System.out.println("cglib 动态代理..."); 
//      return method.invoke(target, args); 
        return methodProxy.invokeSuper(proxy, args);// 推荐写法 
    } 
 
} 

ProductDAO.java

package com.my.cglibproxy; 
 
//目标对象 
public class ProductDAO { 
 
    public void save(){ 
        System.out.println("添加商品..."); 
    } 
 
    public void search(){ 
        System.out.println("搜索商品..."); 
    } 
 
} 

Test.java

package com.my.cglibproxy; 
 
 
public class Test { 
 
    // 没有代理 
    @org.junit.Test 
    public void demo1(){ 
        System.out.println("没有代理"); 
        ProductDAO productDAO = new ProductDAO(); 
 
        productDAO.save(); 
        productDAO.search(); 
        System.out.println("-----------"); 
        System.out.println(); 
    } 
 
    // 使用cglib代理 
    @org.junit.Test 
    public void demo2(){ 
        // 目标 
        System.out.println("使用cglib代理"); 
        ProductDAO productDAO = new ProductDAO(); 
        // 创建代理 
        CglibProxyUtils cglibProxyUtils = new CglibProxyUtils(productDAO); 
        ProductDAO proxy = (ProductDAO) cglibProxyUtils.createProxy(); 
        // 执行方法 
        proxy.save(); 
        proxy.search(); 
    } 
 
 
} 

运行结果:
这里写图片描述

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/12097.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论