八: 动态代理的几种实现方式及优缺点 绝地灬酷狼 2022-02-04 13:47 213阅读 0赞 1. 动态代理 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70] ![学的有点蒙,。。。。。后续再写吧。。。。。。][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 1] JDK 代码示例: 需求, user 实体类 值写入到数据库时, 校验name 长度不能小于1 无侵入性增强 1. 有个接口 UserService package com.enjoylearning.dynamic.proxy.jdk; import com.enjoylearning.dynamic.proxy.User; public interface UserService { void addUser(User user); } 1. 被增强的类必须要继承接口 package com.enjoylearning.dynamic.proxy.jdk; import com.enjoylearning.dynamic.proxy.User; public class UserServiceImpl implements UserService { @Override public final void addUser(User user) { System.out.println("用户数据入库成功,数据为:" + user.toString()); } } 3.拦截器 package com.enjoylearning.dynamic.proxy.jdk; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.logging.Logger; import com.enjoylearning.dynamic.proxy.User; public class UserServiceInterceptor implements InvocationHandler{ private Object realObj; private static Logger logger = Logger.getLogger(UserServiceInterceptor.class.getName()); public Object getRealObj() { return realObj; } public void setRealObj(Object realObj) { this.realObj = realObj; } public UserServiceInterceptor(Object realObj) { super(); this.realObj = realObj; } public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { if(args!=null && args.length>0 && args[0] instanceof User){ User user = (User) args[0]; if(user.getName().trim().length()<=1){ throw new RuntimeException("用户姓名输入长度需要大于1!"); } } Object ret = method.invoke(realObj, args); logger.info("数据库操作成功!"); return ret; } } 4.测试方法 package com.enjoylearning.dynamic.proxy.jdk; import java.lang.reflect.Proxy; import com.enjoylearning.dynamic.proxy.User; public class Client { public static void main(String[] args) { User user = new User(); user.setAddress("地址"); user.setAge(20); user.setName("1ison"); UserService us = new UserServiceImpl(); UserServiceInterceptor usi = new UserServiceInterceptor(us); //1.类加载器 //2. 服务接口信息 //3. invocationhandler 本身 UserService proxy = (UserService) Proxy.newProxyInstance(us.getClass().getClassLoader(), us.getClass().getInterfaces(), usi); //通过动态代理增强业务 proxy.addUser(user); // System.out.println("---------------------"); // System.out.println(proxy.hashCode()); } } CGLIB 动态代理 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 2] 1.被增强的 方法, 不需要继承接口 package com.enjoylearning.dynamic.proxy.cglib; import com.enjoylearning.dynamic.proxy.User; public class UserServiceImpl { public final void addUser(User user) { System.out.println("用户数据入库成功,数据为:"+user.toString()); } } 2.拦截器 实现intercept 方法 package com.enjoylearning.dynamic.proxy.cglib; import java.lang.reflect.Method; import java.util.logging.Logger; import com.enjoylearning.dynamic.proxy.User; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class UserServiceInterceptor implements MethodInterceptor { private static Logger logger = Logger.getLogger(UserServiceInterceptor.class.getName()); public Object intercept(Object obj, Method method, Object[] args,MethodProxy proxy) throws Throwable { if(args!=null && args.length>0 && args[0] instanceof User){ User user = (User) args[0]; if(user.getName().trim().length() <= 1){ throw new RuntimeException("用户姓名输入长度需要大于1!"); } } Object ret = proxy.invokeSuper(obj, args); logger.info("数据库操作成功!"); return ret; } } 1. 测试类 package com.enjoylearning.dynamic.proxy.cglib; import com.enjoylearning.dynamic.proxy.User; import net.sf.cglib.proxy.Enhancer; public class Client { public static void main(String[] args) { User user = new User(); user.setAddress("地址"); user.setAge(20); user.setName("lison"); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(UserServiceImpl.class); enhancer.setCallback(new UserServiceInterceptor()); UserServiceImpl usi1 = (UserServiceImpl) enhancer.create(); usi1.addUser(user); // System.out.println("---------------------"); // System.out.println(usi.hashCode()); // UserServiceImpl us = new UserServiceImpl(); // enhancer.setCallback(new UserServiceDelegateInterceptor(us)); // UserServiceImpl usi2 = (UserServiceImpl) enhancer.create(); // usi2.addUser(user); } } ![在这里插入图片描述][20190510173314831.png] [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70]: /images/20220204/ff9ad736ddd24f82a904facb9b1cf248.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 1]: /images/20220204/2adb3b44a26440cfabb83b45c028a0b4.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTcyNjk3_size_16_color_FFFFFF_t_70 2]: /images/20220204/26d48b818c84457bbd9614fce3d162da.png [20190510173314831.png]: /images/20220204/1eda7899e8274b3b8ad37e5c663a2d87.png
相关 Java 代理模式详解,静态代理与动态代理的区别及优缺点 代理模式是一种常用的设计模式,它允许通过引入一个代理对象来控制对目标对象的访问。在Java中,代理模式被广泛应用,它可以提供额外的功能,如权限检查、缓存、日志记录等,同时还能在 深藏阁楼爱情的钟/ 2023年10月12日 22:01/ 0 赞/ 15 阅读
相关 Java 动态代理的两种方式及其优缺点 前言 动态代理应用非常的广泛,在各种开源的框架中都能看到他们的身影,比如spring中的aop使用动态代理增强,mybatis中使用动态代理生成mapper,动态代理主要 傷城~/ 2023年09月26日 10:56/ 0 赞/ 94 阅读
相关 JDK和Cglib实现动态代理实例及优缺点分析 Spring AOP使用的核心技术是动态代理,说到动态代理就不得不和设计模式中的代理模式联系起来,通过代理模式我们可以对目标类进行功能增强,在某个方法的执行前后增加一些操作,例 迷南。/ 2022年08月09日 09:26/ 0 赞/ 102 阅读
相关 动态代理 两种方式 1、动态代理概述 代理类Proxy和RealSubject应该实现了相同的功能接口,在面向对象的编程之中,如果想要两个对象实现相同的功能,有以下两种方式: 1. 1) 比眉伴天荒/ 2022年06月10日 10:48/ 0 赞/ 171 阅读
相关 Java的两种动态代理方式 动态代理指被代理者委托代理者完成相应的功能,是拦截器的一种实现方式,其用于拦截类或接口,内部可通过判断实现对某个方法的拦截。 jdk方式,委托类必须实现接口,代理类只能 逃离我推掉我的手/ 2022年05月23日 01:40/ 0 赞/ 178 阅读
相关 代理模式实现方式及优缺点对比 代理模式最典型的应用就是AOP,本文结合主要讲解了代理模式的几种实现方式:静态代理和动态代理,这里动态代理又可以分为jdk代理和Cglib代理,另外,本文也对这几种代理模式的优 川长思鸟来/ 2022年03月14日 08:24/ 0 赞/ 158 阅读
相关 八: 动态代理的几种实现方式及优缺点 1. 动态代理 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM 绝地灬酷狼/ 2022年02月04日 13:47/ 0 赞/ 214 阅读
相关 python 使用代理的几种方式 目录 HTTP全局代理:环境变量方式 HTTP全局代理:代码实现方式 SOCKS全局代理 针对部分请求设置代理 -------------------- 本文介绍几 叁歲伎倆/ 2021年09月07日 05:59/ 0 赞/ 1013 阅读
相关 Java动态代理的两种实现方式 动态代理是为了实现在不改变源码的基础上,对已有方法增强,它是AOP思想的底层实现技术。一般而言,动态代理有以下两种实现方式 一、基于接口的动态代理(JDK动态代理) 要... 你的名字/ 2021年04月27日 15:28/ 0 赞/ 541 阅读
还没有评论,来说两句吧...