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动态代理的区别:

  • 相关阅读:
    配置了configuration.xml之后提示找不到映射关系
    alibaba maven地址
    Linux通过FTP上传文件到服务器
    JS模拟PHP的sleep
    PHP设置会话(Session)超时过期时间实现登录时间限制[转]
    JavaScript with JSONPath
    用于解析通过JS的escape函数加密过的数据
    IDC、ICP、ISP区别
    zTree通过指定ID找到节点并选中
    运动轨迹[转]
  • 原文地址:https://www.cnblogs.com/andydlz/p/11959558.html
Copyright © 2011-2022 走看看