【笔记】Spring4框架系列 [ 7 ] 之 Cglib 代理

Cglib代理,也叫做子类代理。在内存中构建一个子类对象从而实现对目标对象功能的扩展。如果想代理没有实现接口的类,就可以使用CGLIB实现。这是一个简单的案例。

【dao】

package com.athl.dao;
/**
 * 目标对象
 */
public class PersonDao {

    public void delete(){

        System.out.println("---删除操作---");
    }
}

【CglibProxyFactory】

package com.athl.proxy;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * Cglib子类代理工厂
 * (对PersonDao 在内存中动态构建一个子类对象)
 */
public class CglibProxyFactory implements MethodInterceptor {

    /* 维护目标对象*/
    private Object target;

    public CglibProxyFactory(Object target) {
        this.target = target;
    }
    /* 给目标对象创建代理对象*/
    public Object getProxyInstance(){
        /*1. 工具类*/
        Enhancer en = new Enhancer();
        /*2. 设置父类(以子类方式在内存中动态创建代理对象,需要知道子类的父类,
         *    此处为target,即是PersonDao的实例对象)
         */
        en.setSuperclass(target.getClass());
        /*3. 设置回调函数(执行target类里的方法时,会触发拦截器中的方法)*/
        en.setCallback(this);
        /*4. 创建子类(代理对象)*/
        return en.create();
    }

    /*
     * CGLib采用非常底层的字节码技术,可以为一个类创建一个子类,
     * 并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势植入横切逻辑。
     */
    @Override
    public Object intercept(Object obj, Method method, Object[] args,
            MethodProxy proxy) throws Throwable {
        /*添加其它代码*/
        System.out.println("--开启事务--");

        /*执行目标对象的方法*/
        Object returnValue = method.invoke(target, args);

        /*添加其它代码*/
        System.out.println("--提交事务--");

        return returnValue;
    }

}

【test】

package com.athl.test;

import org.junit.Test;

import com.athl.dao.PersonDao;
import com.athl.proxy.CglibProxyFactory;

public class Mytest {

    @Test
    public void test() {
        /*目标对象*/
        PersonDao target = new PersonDao();
        System.out.println(target.getClass());

        /*代理对象*/
        PersonDao proxy = (PersonDao)new CglibProxyFactory(target).getProxyInstance();
        System.out.println(proxy.getClass());

        /*执行代理对象的方法*/
        proxy.delete();
    }
}

源码下载:http://download.csdn.net/detail/jul_11th/9742598

谢谢支持!

你可能感兴趣的:(Spring,Spring,4,框架系列)