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

  • 相关阅读:
    D 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
    C 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
    B 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
    A 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
    奥秘月球背面
    嫦娥二号月球图片
    外星人就在月球背面
    月球背面
    分享一个绿色版本 sql server 查询器,
    java 8 原版 api 下载地址,
  • 原文地址:https://www.cnblogs.com/andydlz/p/11959558.html
Copyright © 2011-2022 走看看