初识spring(九)

来源:互联网 发布:诸神黄昏进阶数据 编辑:程序博客网 时间:2024/06/04 18:04

spring代理之cglib代理


当代理类不需要implements接口时,我们就使用cglib代理。实现了一个接口时我们就使用jdk代理。


UserDao.java

package cn.itcast.c_cglib;/** * 目标对象 * @author Jie.Yuan * */public class UserDao {    public void save() {        System.out.println("-----已经保存数据!!!------");    }}

ProxyFactory.java

package cn.itcast.c_cglib;import java.lang.reflect.Method;import org.springframework.cglib.proxy.Enhancer;import org.springframework.cglib.proxy.MethodInterceptor;import org.springframework.cglib.proxy.MethodProxy;/** * Cglib子类代理工厂 * (对UserDao 在内存中动态构建一个子类对象) * @author Jie.Yuan * */public class ProxyFactory implements MethodInterceptor{    // 维护目标对象    private Object target;    public ProxyFactory(Object target){        this.target = target;    }    // 给目标对象创建代理对象    public Object getProxyInstance(){        //1. 工具类        Enhancer en = new Enhancer();        //2. 设置父类        en.setSuperclass(target.getClass());        //3. 设置回调函数        en.setCallback(this);        //4. 创建子类(代理对象)        return en.create();    }    @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;    }}

编写测试类。
App.java

package cn.itcast.c_cglib;public class App {    public static void main(String[] args) {        // 目标对象        UserDao target = new UserDao();        // class cn.itcast.c_cglib.UserDao        System.out.println(target.getClass());        // 代理对象        UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();        // UserDao子类:class cn.itcast.c_cglib.UserDao$$EnhancerByCGLIB$$25d4aeab        System.out.println(proxy.getClass());        // 执行代理对象的方法        proxy.save();    }}

运行结果:

class cn.itcast.c_cglib.UserDao
class cn.itcast.c_cglib.UserDao

EnhancerByCGLIB
e0da0a2b
开始事务…..
—–已经保存数据!!!——
提交事务…..

0 0
原创粉丝点击