SpringAOP静态代理
1、本篇博客的背景和目的
目前我本人正在学习SpringFramework的知识,这也是这个专栏的主题。我前面的几篇博文中,简单的认识了一下SpringFramework,记录了SpringFramework的环境搭建,记录了SpringIOC如何加载配置文件,记录了SpringIOC三种Bean对象的实例化方法。还记录了SpringIOC手动装配(注入)的方法之一:set方法注入。还有另外三个不太常用的SpringIOC手动注入的方法。其实目前大部分都使用的是自动注入的方法,手动注入使用的不多。就算是使用手动注入的方法,使用的主流也是:set方法注入。自动注入的方法主要是使用两个注解,@Autowired注解或者是@Resource注解。两个注解我都记录到了。还记录了如何使用SpringIOC扫描器,SpringIOC中Bean对象的作用域和生命周期,SpringTask的概念和简单使用。本篇博客我记录一下SpringAOP的静态代理的概念和简单使用。
2、我的上一篇博文
我的上一篇博文记录的是SpringTask的概念和简单使用,链接如下:
SpringTask定时任务的概念和简单使用_你是我的日月星河的博客-CSDN博客https://blog.csdn.net/weixin_46281472/article/details/125239290?spm=1001.2014.3001.5501
3、SpringAOP的概念和需要学习的相关知识
首先我粘贴一张图片,展示一下SpringAOP的学习方向,如下所示:
如上图所示,SpringAOP的代理模式分为两种,分别是静态代理和动态代理。其实我们工作中真正使用的比较多的是动态代理。动态代理呢,又分为JDK动态代理和CGLIB动态代理(这种需要引入第三方的依赖)。
首先我们先了解一下什么是代理模式:代理模式是JAVA开发中一种比较常见的设计模式;它的设计目的是 旨在为服务类和客户类之间插入其他功能,插入的功能对于调用者来说是透明的,起到伪装控制的作用;
打个比方吧:比如租房子,房客,中介,房东;对应于代理模式中也就是:客户类,代理类,委托类(被代理类)。
为某一个对象(委托类)提供一个代理(代理类),用来控制对这个对象的访问。委托类和代理类有一个共同的父类或者父接口;代理类会对请求做预处理,过滤,将请求分配给指定对象;
生活中类似代理的情况有很多啊:婚庆公司,租房中介,律师事务所;
代理模式有两个设计原则:
1、代理类 与 委托类 具有相似的行为(共同)
2、代理类增强委托类的行为;
常见的代理模式有:静态代理,动态代理;
4、静态代理的概念
先介绍一下静态代理:
为某一个对象提供一个代理,代理角色是固定的,是为了控制对这个角色的访问;代理类和委托类有共同的父类或者是父接口,这样在任何使用委托类对象的地方都可以使用代理对象替代;代理类负责请求的预处理,过滤,将请求分派给委托类处理,以及委托类执行完请求后的后续处理;
代理的三要素:有共同的行为(父接口,比如租房吧);目标角色(实现行为,比如有房子的人);代理角色(租房中介 也是实现行为,增强目标角色行为);
三要素可以理解为: 谁委托谁做什么事情;
静态代理的特点:
1、目标角色固定;可以说是委托类固定。
2、在应用程序执行前就得到目标角色;
3、代理对象会增强目标对象的行为;
4、有可能存在多个代理,引起“ 类爆炸” (缺点)(比如说吧,租房要有一个代理,结婚要有一个代理,租车要有一个代理 代理太多了)
5、静态代理的简单代码实现
静态代理其实真正使用的不多,真正使用的是动态代理。所以这里我就不做很复杂的代码实现了。
如上图所示,我们首先创建一个 RentHouse接口,这个接口就是我们的共同行为
共同行为RentHouse接口的代码如下:
package com.dcy.statics;/*
这个是父类或者是父接口 也就是委托类和代理类共同的行为*/
public interface RentHouse {public void toRentHouse();public String toRentHouse2(String name);
}
里面有两个方法,后面的代理类和委托类都需要继承实现这个接口。
然后就是我们的委托类(也就是想要出租房子的人) You,代码如下:
package com.dcy.statics;/*
静态代理
下面这个是我们的 目标对象 也就是 委托类*/
public class You implements RentHouse{@Overridepublic void toRentHouse() {System.out.println("我要租一个两室一厅");}@Overridepublic String toRentHouse2(String name) {System.out.println(name+"要第二次租房");return "好的吧";}
}
很明显,上面的委托类继承实现了共同行为接口RentHouse。
然后就是我们的代理类(也就是租房中介)Agency,代码如下:
package com.dcy.statics;/*
静态代理
这个是代理类 实现行为,还要增强目标对象的行为,*/
public class Agency implements RentHouse{private RentHouse target;//下面我们需要提供一个有参构造,传递我们的目标对象public Agency(RentHouse target) {this.target = target;}@Overridepublic void toRentHouse() {//下面这句话也是增强了行为System.out.println("这里是中介");target.toRentHouse();System.out.println("准备合同");}@Overridepublic String toRentHouse2(String name) {return null;}
}
上面是代理类,类似于租房中介,代替房东行使一定的权力。既然是代理类,肯定和委托类是有相同的行为的,那么也是需要继承实现共同行为接口RentHouse的。既然是代理类,那么它究竟是谁的代理呢?为了体现它是谁的代理这一点,我们在代理类中加入了一个私有的成员变量,类型是RentHouse类型(共同行为接口),然后加入了一个有参构造,用来初始化这个私有成员变量。私有成员变量初始化以后,我们就可以在代理类的方法里面使用这个私有成员变量(也就是委托类对象,因为委托类对象实现了共同行为接口)的方法行为。
最后我们在Main方法里面进行一下简单的测试,代码如下所示:
package com.dcy.statics;public class Starter {public static void main(String[] args) {You you=new You();Agency agency=new Agency(you);agency.toRentHouse();}
}
运行结果如下所示:
我们需要明白的一点是:代理类最终调用的还是我们委托类中的方法;这一点是很容易从我上面简单的示例代码中看出来的。
如果我们的委托类有很多想要代理的事情,那么就需要有多个接口,有多个代理类;这明显是很麻烦的,也是静态代理的缺点,多以静态代理我们真正是不用的,用的是动态代理。
上述的例子是非常简单的例子,具体的使用肯定是很复杂的;
但是我们一般也是不使用静态代理的;
6、我的下一篇博文
下一篇博文我介绍一下真正使用的动态代理,链接如下所示:
SpringAOP静态代理相关推荐
- SpringAOP静态代理和动态代理
代理模式应用于SpringAOP. SpringAOP.即面向切面的编程范式.多用于权限控制,异常处理,日志管理等场景.主要作用是分离功能性需求和非功能性需求,减少代码冗余.我们在使用的时候可以集中处 ...
- spring AOP原理分析:静态代理;JDK实现接口动态代理;Cglib继承父类代理;SpringAop的责任链模式调用
普通静态代理 代理类和真实类都需要实现同一个接口 接口 package com.fchan.layui.represent.service; /*** 静态代理demo*/ public interf ...
- Spring-AOP 静态正则表达式方法匹配切面
文章目录 概述 实例 正则表达式语法 正则表达式工具 RegexBuddy 概述 在Spring-AOP 静态普通方法名匹配切面案例中 StaticMethodMatcherPointcutAdvis ...
- Spring系列之静态代理、动态代理、cglib代理与Spring AOP的处理
本章内容 代理的概念及理解 如何实现静态代理 如何实现动态代理 静态代理与动态代理有什么区别与优缺点 JDK动态代理如何实现 cglib动态代理如何实现 JDK动态代理与cglib动态代理的区别 Sp ...
- Java设计模式(五)代理设计模式—静态代理—JDK动态代理—Cglib动态代理
文章目录 什么是代理模式 代理模式应用场景 代理的分类 静态代理 什么是静态代理 深入解析静态代理 小结 动态代理 什么是动态代理 JDK动态代理 原理和实现方式 代码实现 优缺点 Cglib动态代理 ...
- 【Spring AOP】静态代理设计模式、Spring 动态代理开发详解、切入点详解(切入点表达式、切入点函数)
AOP 编程 静态代理设计模式 1. 为什么需要代理设计模式 2. 代理设计模式 名词解释 代理开发的核心要素 静态代理编码 静态代理存在的问题 Spring 动态代理开发 搭建开发环境 Spring ...
- Spring AOP中的静态代理和动态代理的原理和实践
对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利.无论你是对的还是错的,都会在这个平台上找到答案.所以,我会尽可能去写 ...
- SSM3==理解静态代理、动态代理Proxy.newProxyInstance、cglib代理==通过纯XML配置spring AOP,通过纯注解配置spring AOP
静态代理: 为什么要代理?在不改动原代码的基础上,丰富调用某个方法时实现的功能. 比如service类中原本update只会更新,但是通过代理类加上了判断权限和输出时间的功能. 其实这些功能也可以写在 ...
- 静态代理、动态代理概念及使用
文章目录 1. 为什么要用静态代理 2. 静态代理的实现 3. 静态代理的缺点 4. 动态代理 4.1 JDK动态代理 4.1.1 InvocationHandler 4.1.2 Class 4.1. ...
- 研磨23种大话设计模式------动态代理模式 + 小结静态代理模式
大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 在 ...
最新文章
- javascript之prototype总结常用方法
- 文本分类实战(七)—— Adversarial LSTM模型
- 初识遗传算法 蚁群算法
- android wp8相机,体验提升明显 WP8.1相机对比专业拍摄
- matlab中图像太大,图像处理:算法在MATLAB中耗时太长
- 绕过360安全卫士的部分代码
- flask对mysql数据库增删改查_Flask学习(三) - Flask-SQLAlchemy对数据库增删改查
- [转]关于凸优化的一些简单概念
- 2021 年前端趋势预测
- sed教程入门与实例练习(三)
- Qt——消息对话框的设计
- BUUCTF------相册
- CRT查看日志中文乱码问题
- 考取FRM证书的三大好处,可能你还不知道
- 误删除系统libselinux.so.1之后
- 程序化广告(5):广告投放
- 阿里云服务器地域和可用区常见问题及官方资料解答
- qq公众平台出错了609_中仑供应链业务线:一站式快消品订货平台
- [极客大挑战 2019]Upload
- pdf转换成txt转换器怎么用
热门文章
- 安科瑞无线测温方案part1
- html5 数据库 视图,创建视图的sql语句是什么
- IE无法打开链接的处理方法
- 第三章(第一部分) 月夜猫の魅 友谊的决裂
- vue导入pdf插件报错
- Verilog 中的Procedural continuous assignments
- 电梯卫士等对计算机的应用,小班安全活动教案:电梯小卫士教案
- D. Concatenated Multiples
- C语言中fflush()、fflush(stdin)、fflush(stdout)
- ofo的智能锁初代方案:声波频率识别开锁