前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java常用Cglib代理模式

Java常用Cglib代理模式

原创
作者头像
用户7999227
修改2021-10-08 15:04:38
2520
修改2021-10-08 15:04:38
举报
文章被收录于专栏:Java小王子Java小王子

 上面的静态代理和动态代理模式都是要求目标对象实现一个接口或者多个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以使用构建目标对象子类的方式实现代理,这种方法就叫做:Cglib代理。   Cglib代理,也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能的扩展。

  • Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口。它广泛的被许多AOP的框架使用,例如Spring AOP和synaop,为他们提供方法的interception(拦截)
  • Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的子类
  • 代理的类不能为final,否则报错;目标对象的方法如果为final/static,那么就不会被拦截。

代码示例: 目标对象类:UserDao.java

代码语言:javascript
复制
    /**
     * 目标对象,没有实现任何接口
     */
    public class UserDao {

        public void save() {
            System.out.println("----已经保存数据!----");
        }
    }

Cglib代理工厂:ProxyFactory.java

代码语言:javascript
复制
    /**
     * Cglib子类代理工厂
    * 对UserDao在内存中动态构建一个子类对象
    */
    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;
        }
    }

测试类:

代码语言:javascript
复制
    /**
     * 测试类
     */
    public class App {

        @Test
        public void test(){
            //目标对象
            UserDao target = new UserDao();

            //代理对象
            UserDao proxy = (UserDao)new ProxyFactory(target).getProxyInstance();

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档