动态代理

动态代理和静态代理角色一样
动态代理类是动态生成的,不是我们直接写好的。
动态代理分为两大类:基于接口的动态代理:JDK动态代理【我们在这里使用】基于类的动态代理:cglibjava字节码:javasist  (Jboss服务器)需要了解2个类:Proxy 代理,invocationHandler 反射包下reflect

实体类:

/*** @author LongXi* @create 2021-05-30 10:01*/
public class Host implements Rent {@Overridepublic void rent() {System.out.println("房东要出租房子");}
}
/*** @author LongXi* @create 2021-05-30 10:00*/
public interface Rent {public void rent();
}

代理类接口

/*** @author LongXi* @create 2021-05-30 12:58*/
//我们会用这个类,自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Rent rent;//生成得到代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent.getClass().getInterfaces(),this);}//处理代理实例,并返回结果@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {this.seeHouse();//动态代理的本质,就是使用反射机制实现Object result = method.invoke(rent, args);this.fare();return result;}public void setRent(Rent rent) {this.rent = rent;}public void seeHouse(){System.out.println("中介带看房子");}private void fare(){System.out.println("收中介费");}
}

客户类

/*** @author LongXi* @create 2021-05-30 13:07*/
public class Client {public static void main(String[] args) {//真是角色Host host = new Host();//代理角色,现在没有ProxyInvocationHandler pih = new ProxyInvocationHandler();pih.setRent(host);//这个proxy就是动态生成的,我们并没有写Rent proxy = (Rent) pih.getProxy();proxy.rent();}
}

测试

改造Demo2

追加代理接口

/*** @author LongXi* @create 2021-05-30 12:58*/
//我们会用这个类,自动生成代理类
public class ProxyInvocationHandler implements InvocationHandler {//被代理的接口private Object target;//生成得到代理类public Object getProxy(){return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(),this);}//处理代理实例,并返回结果@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {log(method.getName());//动态代理的本质,就是使用反射机制实现Object result = method.invoke(target, args);return result;}public void setTarget(Object target) {this.target = target;}public  void log(String msg){System.out.println("执行了"+ msg + "方法");}
}

客户类

/*** @author LongXi* @create 2021-05-30 13:23*/
public class Client {public static void main(String[] args) {//真是角色UserServiceImpl userService =new UserServiceImpl();//代理角色不存在ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler();proxyInvocationHandler.setTarget(userService);//动态生成代理类UserService proxy = (UserService) proxyInvocationHandler.getProxy();proxy.add();proxy.delete();}
}

测试

动态代理的好处:
静态代理的好处全都有
一个动态代理类,代理的是一个接口,一般就是对应的一类业务
一个动态代理类,可以代理多个类,只要实现了同一个接口即可。

Spring之AOP动态代理详解相关推荐

  1. JAVA动态代理详解

    JAVA动态代理详解 问题 1:什么是静态代理,动态代理? 2:动态代理的好处? 什么是静态代理 以生活中例子来看,我作为某某品牌面膜的北京区代理,我替厂家卖面膜,我属于代理,厂家属于委托方. 联系到 ...

  2. spring中AOP动态代理的两种方式

    AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...

  3. spring中aop默认使用jdk动态代理,springboot2以后默认使用cglib来实现动态代理详解

    Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...

  4. Spring AOP 与代理详解

    SpringBoot 系列教程 - 源码地址:https://github.com/laolunsi/spring-boot-examples 大家知道我现在还是一个 CRUD 崽,平时用 AOP 也 ...

  5. Java 动态代理详解 ( 附示例源码,建议收藏)

    动态代理在Java中有着广泛的应用,比如Spring AOP.Hibernate数据查询.测试框架的后端mock.RPC远程调用.Java注解对象获取.日志.用户鉴权.全局性异常处理.性能监控,甚至事 ...

  6. java动态代理_Java代理模式及动态代理详解

    Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式 无 ...

  7. 为什么要用动态代理?静态代理与动态代理详解

    代理模式: 代理模式在Java中特别常见,如spring AOP功能就是用代理来实现的.代理模式作用是:在不修改被代理对象功能的基础上,通过对代理类进行扩展,进行一些功能上的附加与增强. 一般使用代理 ...

  8. 【Spring学习】Spring的AOP模块应用详解

    面向切面编程(AOP)的思想就是在执行某些代码前执行另外的代码,使程序更灵活.扩展性更好,可以随便地添加删除某些功能. javaweb机制中的filter就是面向切面编程的例子.Tomcat会在程序运 ...

  9. Java中的动态代理详解

    前言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...

最新文章

  1. Cocos Creator里localStorage的使用
  2. 图灵奖得主Bengio又出新论文:用强化学习提升模型泛化性!网友崩溃:idea撞车了......
  3. iterator与iterable
  4. 2021年春季学期-信号与系统-第十二次作业参考答案-第六小题
  5. UI Bootstrap
  6. 【UIKit】文本框(UITextField)及键盘遮挡处理和回收
  7. windows 解决 Go下载包失败 设置代理
  8. shfflenetv2代码解读
  9. ARKit从入门到精通(11)-ARKit开发常见问题及解决方案
  10. 【ArcGIS微课1000例】0013:ArcGIS创建色带图例(以GlobeLand30土地覆盖数据为例)
  11. leetcode 26. 删除有序数组中的重复项
  12. python之yield的一些应用
  13. 向“3+1” SQLServer2008集群增加磁盘
  14. wps怎么做时间线_时间不够用怎么办?如何做才会更高效
  15. python统计数据库中每个数的个数,如何统计每个数据库中每个集合中的文档数?...
  16. java 命令行运行 打包 IDEA
  17. (油菜花)为什么别的项目中的category拖到自己项目中无法使用?
  18. 艾宾浩斯记忆表格excel_艾宾浩斯打卡群第二期邀请函
  19. 管家婆 mysql_管家婆软件恢复账套数据图解-通过数据库源文件
  20. 微信跳转浏览器html5,微信跳转浏览器或提示手机端打开HTML代码 最新

热门文章

  1. android samba github,安卓手机访问树莓派samba文件共享出错解决
  2. linux的ky3关闭防火墙,ky3-8
  3. 用计算机听音乐和看电影的ppt,五年级下册信息技术课件-第六课 用计算机听音乐和看电影 川教版 (共13张PPT)...
  4. Django day17 博客项目(一)
  5. Emgu-WPF学习使用-阈值化
  6. SVN服务的部署及使用
  7. 数据属性和访问器属性
  8. HTML+CSS页面练习——legend第九部分
  9. Hibernate框架之HQL查询与Criteria 查询的区别
  10. Nagios3完整配置文档