【Spring】Spring中的设计模式

文章目录

  • 责任链模式
  • 工厂模式
  • 适配器模式
  • 代理模式
  • 模版方法
  • 观察者模式
  • 构造器模式

责任链模式

Spring中的Aop的通知调用会使用责任链模式

责任链模式介绍

角色:抽象处理者(Handler)具体处理者(ConcreteHandler1)客户类角色(Client)

Spring源码介绍

spring中Aop的责任链模式,相对于传统的责任链模式做了一定的改造。
传统的设计模式,抽象处理者会有一个方法设置和获取具体处理者的下一个处理者的方法。
如:

public abstract class Handler {private Handler next;public Handler getNext() {return next;}public void setNext(Handler next) {this.next = next;}//处理请求的方法public abstract void handleRequest(String request);
}

但是Spring中的责任链模式没有这两个方法,而是抽出一个公共的处理方法,方法内有数组和下标来完成链式。

public class ReflectiveMethodInvocation implements ProxyMethodInvocation, Cloneable {// 环绕通知类protected final List<?> interceptorsAndDynamicMethodMatchers;// 下标private int currentInterceptorIndex = -1;
/*** 递归获取通知,然后执行* @return* @throws Throwable*/@Override@Nullablepublic Object proceed() throws Throwable {// We start with an index of -1 and increment early.// 从索引为-1的拦截器开始调用,并按序递增,如果拦截器链中的拦截器迭代调用完毕,开始调用target的函数,这个函数是通过反射机制完成的// 具体实现在AopUtils.invokeJoinpointUsingReflection方法中if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {return invokeJoinpoint();}// 获取下一个要执行的拦截器,沿着定义好的interceptorOrInterceptionAdvice链进行处理Object interceptorOrInterceptionAdvice =this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) {// Evaluate dynamic method matcher here: static part will already have// been evaluated and found to match.// 这里对拦截器进行动态匹配的判断,这里是对pointcut触发进行匹配的地方,如果和定义的pointcut匹配,那么这个advice将会得到执行InterceptorAndDynamicMethodMatcher dm =(InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice;Class<?> targetClass = (this.targetClass != null ? this.targetClass : this.method.getDeclaringClass());if (dm.methodMatcher.matches(this.method, targetClass, this.arguments)) {return dm.interceptor.invoke(this);}else {// Dynamic matching failed.// Skip this interceptor and invoke the next in the chain.// 如果不匹配,那么proceed会被递归调用,知道所有的拦截器都被运行过位置return proceed();}}else {// It's an interceptor, so we just invoke it: The pointcut will have// been evaluated statically before this object was constructed.// 普通拦截器,直接调用拦截器,将this作为参数传递以保证当前实例中调用链的执行return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);}}
}

其中的最后一句

// 普通拦截器,直接调用拦截器,将this作为参数传递以保证当前实例中调用链的执行
return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);

MethodInterceptor就是抽象处理者

@FunctionalInterface
public interface MethodInterceptor extends Interceptor {/*** */Object invoke(MethodInvocation invocation) throws Throwable;
}

具体的执行者有
AspectJAfterAdvice、AspectJAfterReturningAdvice、AspectJAfterThrowingAdvice、AspectJMethodBeforeAdvice、AspectJAroundAdvice

工厂模式

Spring中的获取Bean就是工厂模式,如:BeanFactory获取

工厂模式介绍

角色:抽象产品具体产品抽象工厂具体工厂

Spring源码介绍

抽象工厂

public interface BeanFactory {Object getBean(String name) throws BeansException;...
}

具体工厂

适配器模式

Spring中的根据通知的时候,将Advisor适配为MethodInterceptor

适配器介绍

角色目标接口:抽象适配器:具体适配器:抽象源接口:具体源接口:适配器就是将源接口适配为目标接口

Spring中的源码介绍

抽象适配器:

public interface AdvisorAdapter {/*** 适配方法,将Advisor适配为MethodInterceptor Advisor就是源接口:MethodInterceptor就是目标接口*/MethodInterceptor getInterceptor(Advisor advisor);
}

具体适配器:
在这里插入图片描述

class AfterReturningAdviceAdapter implements AdvisorAdapter, Serializable {@Overridepublic boolean supportsAdvice(Advice advice) {return (advice instanceof AfterReturningAdvice);}@Overridepublic MethodInterceptor getInterceptor(Advisor advisor) {AfterReturningAdvice advice = (AfterReturningAdvice) advisor.getAdvice();return new AfterReturningAdviceInterceptor(advice);}
}

具体源接口:
在这里插入图片描述

代理模式

cglib、gdk代理

模版方法

Spring中的refresh方法中的postProcessFactory、onRefresh等

观察者模式

Spring中的事件监听

角色:
抽象目标,
具体目标,
具体观察者,
抽象观察者

抽象目标里面会有一个数组,存放具体的观察者,并且会有一个添加删除观察者的方法,还有一个通知所有观察者的方法。具体目标需要通知观察者的时候,遍历数组通知观察者

Spring中的事件监听做了一定的变动
有四个角色
广播器:其实就是我们的抽象目标,包含了添加删除,广播事件方法
监听器:监听广播器广播的事件
事件:
事件源:触发事件的人,将事件添加到广播器中

构造器模式

Spring中解析xml或者注解为BeanDefinition信息的时候会使用BeanDefinitionHandler类

该类里面包含了一个 BeanDefinition 字段,可以调佣BeanDefinitionHandler中的方法给该字段设值,最后可以调用方法获取BeanDefinition

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/30154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

14.3.4 【Linux】使用 LVM thin Volume 让 LVM 动态自动调整磁盘使用率

想像一个情况&#xff0c;你有个目录未来会使用到大约 5T 的容量&#xff0c;但是目前你的磁盘仅有 3T&#xff0c;问题是&#xff0c;接下来的两个月你的系统都还不会超过 3T 的容量&#xff0c; 不过你想要让用户知道&#xff0c;就是他最多有 5T 可以使用就是了&#xff01;…

Docker+rancher部署SkyWalking8.5并应用在springboot服务中

1.Skywalking介绍 Skywalking是一个国产的开源框架&#xff0c;2015年有吴晟个人开源&#xff0c;2017年加入Apache孵化器&#xff0c;国人开源的产品&#xff0c;主要开发人员来自于华为&#xff0c;2019年4月17日Apache董事会批准SkyWalking成为顶级项目&#xff0c;支持Jav…

Stable Diffusion - 俯视 (from below) 拍摄的人物图像 LoRA 与配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/132192139 图像来自 哥特风格 LoRA 俯视 LoRA&#xff0c;提升视觉冲击力&#xff0c;核心配置 <lora:view_from_below:0.6>,(from below,…

工程管理系统简介 工程管理系统源码 java工程管理系统 工程管理系统功能设计em

工程项目管理软件&#xff08;工程项目管理系统&#xff09;对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营&#xff0c;全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#xff…

什么是进程、线程、协程

什么是进程&#xff1f; 我们都知道计算机的核心是CPU&#xff0c;它承担了所有的计算任务&#xff1b;而操作系统是计算机的管理者&#xff0c;它负责任务的调度、资源的分配和管理&#xff0c;统领整个计算机硬件&#xff1b;应用程序则是具有某种功能的程序&#xff0c;程序…

github上有哪些值得读源码的react项目?

前言 下面是我整理的关于值得一读源码的react项目&#xff0c;希望对你有所帮助~ 1、 calcom Star: 21.6k calcom是一个开源的计算器应用程序。它提供了基本的数学运算功能&#xff0c;例如加法、减法、乘法和除法&#xff0c;还支持 科学计算、进制转换和单位转换等高级功能…

IP首部校验和字段计算方法

IP首部有16bit的校验和&#xff0c;因此&#xff0c;IP首部以16bit为单位计算校验和&#xff0c;IP首部的长度一定是16bit的整倍数&#xff0c;这是由于首部长字段的单位是32bit&#xff0c;首部长度不足32bit的整数倍时&#xff0c;会在尾部补0到32bit的整数倍。 发送方计算方…

【linux-keepalive】keepalive避免单点故障,高可用配置

keepalive: [rootproxy ~]# yum install -y keepalived [rootproxy ~]# vim /etc/keepalived/keepalived.conf global_defs {router_id proxy1 //设置路由ID号vrrp_iptables //不添加任何防火墙规则 } vrrp_instance V…

【点云分割】常用数据集介绍—— ShapeNet数据集

文章目录 一、简介二、数据集版本三、目录四、应用与用途五、其他数据集链接 一、简介 ShapeNet 是一个广泛使用的三维形状理解和分析的数据集&#xff0c;用于学术研究和计算机视觉任务。它是一个大规模的、多类别的三维模型数据库&#xff0c;包含了大量的三维模型。&#x…

【等保测评】云计算Linux服务器(一)

【等保测评】云计算&Linux服务器&#xff08;一&#xff09; 前言1、身份鉴别实例1实例2实例3实例4 2、访问控制实例1实例2实例3实例4实例5实例6实例7 前言 Linux是指UNIX克隆或类UNIX风格的操作系统&#xff0c;在源代码级别兼容绝大部分UNIX标准(IEEE POSIX, System V, …

接缝雕刻算法的 C++ 实现 - 算法概述与基本原理

第一部分:接缝雕刻算法的 C++ 实现 - 算法概述与基本原理 接缝雕刻(Seam Carving)是一种用于图像大小调整的算法,其目标是在不扭曲图像的“重要”部分的情况下调整图像大小。这种算法的主要优点是,它可以保持图像的视觉完整性,同时改变图像的尺寸。这与传统的图像缩放方…

c语言每日一练(4)

五道选择题 1、有以下代码&#xff0c;程序的输出结果是( ) #include <stdio.h> int main() {int a 0, b 0;for (a 1, b 1; a < 100; a){if (b > 20) break;//1if (b % 3 1)//2{b b 3;continue;}b b-5;//3}printf("%d\n", a);return 0; } A.1…

Vue原理解析:Vue到底是什么?

Vue.js是一种流行的JavaScript框架&#xff0c;用于构建用户界面。它采用了MVVM&#xff08;Model-View-ViewModel&#xff09;架构模式&#xff0c;旨在简化Web应用程序的开发过程。Vue具有响应式的数据绑定和组件化的特性&#xff0c;使得开发者能够以声明式的方式构建可复用…

vue3中监听,组件通信如父子传值、Vuex、Event Bus的使用

目录 一、监听 二、父子传值&#xff1a; 1、父传子&#xff1a; 2、子传父 三、全局状态管理&#xff08;Vuex&#xff09;&#xff1a; 四、事件总线&#xff08;Event Bus&#xff09;&#xff1a; 一、监听 <template><div><p>Count: {{ count }}…

【ARM Cache 系列文章 8 -- ARM DynamIQ 技术介绍

文章目录 DynamIQ 技术背景DynamIQ技术详解DynamIQ 与 big.LITTLEDynamIQ cluster 分类硬件支持 DynamIQ为什么适合人工智能&#xff1f; DynamIQ 技术背景 2017年3月21日下午&#xff0c;ARM在北京金隅喜来登酒店召开发布会&#xff0c;正式发布了全新的有针对人工智能及机器…

pyspark笔记 筛选条件 vs intersect

一个是filter提供条件时&#xff0c;条件的交集&#xff0c;一个是两个pyspark DataFrame 取交集 前者会有重复的行&#xff0c;后者则没有 举例说明&#xff0c;假设我们有如下的pyspark DataFrame d[[-1],[1],[1],[2],[3],[4]] dfspark.createDataFrame(d,[id]) df.show()-…

算法练习--数值相关

文章目录 整型数组合并质数因子 整型数组合并 将两个整型数组按照升序合并&#xff0c;并且过滤掉重复数组元素。 输出时相邻两数之间没有空格。 输入描述&#xff1a; 1 输入第一个数组的个数 2 输入第一个数组的所有数值 3 输入第二个数组的个数 4 输入第二个数组的所有数值…

IDEA创建项目常见问题

1.IDEA修改maven路径无效 创建spring项目&#xff0c;Maven导入报错&#xff0c;无法正常导入jar报&#xff0c;发现setting中设置的maven路径不是自己下载的路径&#xff0c;修改后无效。运行之后maven路径又恢复为其默认的路径 解决方案&#xff1a; 删除.mvn文件&#xff0…

openCV 图像对象的创建和赋值

文章目录 一、赋值二、克隆三、拷贝四、初始化 一、赋值 赋值操作是将一个cv::Mat对象的数据复制到另一个对象中。赋值操作使用的是浅拷贝&#xff08;shallow copy&#xff09;&#xff0c;即两个对象共享相同的数据内存。这意味着对一个对象的修改会影响到另一个对象 cv::M…

dinput8.dll导致游戏打不开的解决方法,快速修复dinput8.dll文件

当你尝试启动某个游戏时&#xff0c;如果遇到dinput8.dll文件缺失或损坏的错误提示&#xff0c;可能会导致游戏无法正常运行。dinput8.dll是DirectInput API的一部分&#xff0c;它提供了游戏手柄、键盘和鼠标等输入设备的支持。本文将详细介绍dinput8.dll的作用、导致游戏无法…