zoukankan      html  css  js  c++  java
  • CGLB实现动态代理

    示例背景:现有addUser方法,我们用动态代理给该方法增加校验:添加用户时姓名长度少于2报错。

    1.实体类

    package com.example.xiangxue.demo.proxy.jdkproxy.CGLBproxy;
    
    public class User {
    
        public String name;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }

    2.业务类:无需实现接口

    package com.example.xiangxue.demo.proxy.jdkproxy.CGLBproxy;
    
    
    public class UserServiceImpl{
    
        public void addUser(User user) {
            System.out.println("用户添加成功····");
        }
    }

    3.写一个类实现MethodInterceptor 接口,在重写的intercept方法中编写增强的代码;

    package com.example.xiangxue.demo.proxy.jdkproxy.CGLBproxy;
    
    
    import net.sf.cglib.proxy.MethodInterceptor;
    import net.sf.cglib.proxy.MethodProxy;
    import java.lang.reflect.Method;
    
    public class UserServiceInterceptor implements MethodInterceptor {
    
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy)
                throws Throwable {
            if (objects[0] instanceof User){
                User u  = (User)objects[0];
                if (u.getName().trim().length() < 2) {
                    throw new RuntimeException("用户名字不合规 小于2了。。");
                }
            }
    
            Object ret = methodProxy.invokeSuper(o,objects);
            System.out.println("数据库操作成功····");
            return ret;
        }
    }

    4.使用 Enhancer的creat方法得到增强类,执行方法即可

    package com.example.xiangxue.demo.proxy.jdkproxy.CGLBproxy;
    
    import net.sf.cglib.proxy.Enhancer;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Test {
        public static void main(String[] args) {
            User user = new User();
            user.setName("1");
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(UserServiceImpl.class);
            enhancer.setCallback(new UserServiceInterceptor());
            UserServiceImpl userService = (UserServiceImpl)enhancer.create();
            userService.addUser(user);
        }
    }

    实现效果:

     jdk动态代理和cglb动态代理的区别:

  • 相关阅读:
    问题解决:FFmpeg视频编解码库,无法解析的外部信号
    2016,最值得市场营销人员关注的数字营销策略
    排序
    hdu 1385 Minimum Transport Cost(floyd &amp;&amp; 记录路径)
    使用Android SwipeRefreshLayout了解Android的嵌套滑动机制
    搜索引擎keyword智能提示的一种实现
    维度模型数据仓库基础对象概念一览
    vs2015编译zlib1.2.8
    关系数据库关系的完整性
    XMPPFrameWork IOS 开发(一)xmpp简介
  • 原文地址:https://www.cnblogs.com/andydlz/p/11959558.html
Copyright © 2011-2022 走看看