Spring之AOP动态代理详解
动态代理
动态代理和静态代理角色一样
动态代理类是动态生成的,不是我们直接写好的。
动态代理分为两大类:基于接口的动态代理: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动态代理详解相关推荐
- JAVA动态代理详解
JAVA动态代理详解 问题 1:什么是静态代理,动态代理? 2:动态代理的好处? 什么是静态代理 以生活中例子来看,我作为某某品牌面膜的北京区代理,我替厂家卖面膜,我属于代理,厂家属于委托方. 联系到 ...
- spring中AOP动态代理的两种方式
AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...
- spring中aop默认使用jdk动态代理,springboot2以后默认使用cglib来实现动态代理详解
Spring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里: 真的假的?查阅文档 刚看到这个说法的时候,我是保持怀疑态度的. 大家都知道 Spring5 之前的版本 AOP ...
- Spring AOP 与代理详解
SpringBoot 系列教程 - 源码地址:https://github.com/laolunsi/spring-boot-examples 大家知道我现在还是一个 CRUD 崽,平时用 AOP 也 ...
- Java 动态代理详解 ( 附示例源码,建议收藏)
动态代理在Java中有着广泛的应用,比如Spring AOP.Hibernate数据查询.测试框架的后端mock.RPC远程调用.Java注解对象获取.日志.用户鉴权.全局性异常处理.性能监控,甚至事 ...
- java动态代理_Java代理模式及动态代理详解
Java的动态代理在实践中有着广泛的使用场景,比如最场景的Spring AOP.Java注解的获取.日志.用户鉴权等.本篇文章带大家了解一下代理模式.静态代理以及基于JDK原生动态代理. 代理模式 无 ...
- 为什么要用动态代理?静态代理与动态代理详解
代理模式: 代理模式在Java中特别常见,如spring AOP功能就是用代理来实现的.代理模式作用是:在不修改被代理对象功能的基础上,通过对代理类进行扩展,进行一些功能上的附加与增强. 一般使用代理 ...
- 【Spring学习】Spring的AOP模块应用详解
面向切面编程(AOP)的思想就是在执行某些代码前执行另外的代码,使程序更灵活.扩展性更好,可以随便地添加删除某些功能. javaweb机制中的filter就是面向切面编程的例子.Tomcat会在程序运 ...
- Java中的动态代理详解
前言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执 ...
最新文章
- Cocos Creator里localStorage的使用
- 图灵奖得主Bengio又出新论文:用强化学习提升模型泛化性!网友崩溃:idea撞车了......
- iterator与iterable
- 2021年春季学期-信号与系统-第十二次作业参考答案-第六小题
- UI Bootstrap
- 【UIKit】文本框(UITextField)及键盘遮挡处理和回收
- windows 解决 Go下载包失败 设置代理
- shfflenetv2代码解读
- ARKit从入门到精通(11)-ARKit开发常见问题及解决方案
- 【ArcGIS微课1000例】0013:ArcGIS创建色带图例(以GlobeLand30土地覆盖数据为例)
- leetcode 26. 删除有序数组中的重复项
- python之yield的一些应用
- 向“3+1” SQLServer2008集群增加磁盘
- wps怎么做时间线_时间不够用怎么办?如何做才会更高效
- python统计数据库中每个数的个数,如何统计每个数据库中每个集合中的文档数?...
- java 命令行运行 打包 IDEA
- (油菜花)为什么别的项目中的category拖到自己项目中无法使用?
- 艾宾浩斯记忆表格excel_艾宾浩斯打卡群第二期邀请函
- 管家婆 mysql_管家婆软件恢复账套数据图解-通过数据库源文件
- 微信跳转浏览器html5,微信跳转浏览器或提示手机端打开HTML代码 最新
热门文章
- android samba github,安卓手机访问树莓派samba文件共享出错解决
- linux的ky3关闭防火墙,ky3-8
- 用计算机听音乐和看电影的ppt,五年级下册信息技术课件-第六课 用计算机听音乐和看电影 川教版 (共13张PPT)...
- Django day17 博客项目(一)
- Emgu-WPF学习使用-阈值化
- SVN服务的部署及使用
- 数据属性和访问器属性
- HTML+CSS页面练习——legend第九部分
- Hibernate框架之HQL查询与Criteria 查询的区别
- Nagios3完整配置文档