Spring框架中都用到了哪些设计模式?
大家好,我是锋哥。今天分享关于【Spring框架中都用到了哪些设计模式?】面试题。希望对大家有帮助;
Spring框架中都用到了哪些设计模式?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
Spring框架中使用了大量的设计模式,这些设计模式帮助Spring实现了灵活、可扩展、易维护的架构。以下是Spring中常见的一些设计模式:
1. 工厂方法模式(Factory Method Pattern)
工厂方法模式是Spring中广泛使用的设计模式,主要体现在Spring的IoC容器中。容器通过工厂方法来实例化Bean,而不是直接使用new关键字。工厂方法模式使得对象的创建和管理从使用者中解耦出来,具体的实例化细节交给容器。
- 例如,
ApplicationContext或BeanFactory容器使用工厂方法创建和管理Bean实例。
2. 单例模式(Singleton Pattern)
Spring中的默认Bean作用域是单例模式,即每个Bean在整个Spring容器中只会存在一个实例。当容器启动时,所有标记为单例作用域的Bean都会被创建,并在整个应用程序生命周期中复用。这种模式确保了内存资源的高效利用。
- 默认情况下,Spring容器中的Bean都是单例的。
3. 依赖注入(Dependency Injection, DI)
依赖注入本身是一种设计模式,用于实现控制反转(IoC)。Spring通过依赖注入来解耦对象之间的关系,而不是让对象自己管理依赖,Spring负责将依赖关系注入到对象中,从而提高了系统的灵活性和可维护性。
- DI有不同的实现方式,如构造器注入、Setter注入、字段注入等。
4. 代理模式(Proxy Pattern)
Spring使用代理模式来实现AOP(面向切面编程)。代理模式通过在运行时创建一个代理对象,拦截对目标对象的访问,添加额外的行为(如日志、事务管理等)。Spring AOP基于JDK动态代理或CGLIB代理实现,代理模式允许在不修改目标对象的情况下,为其添加额外的行为。
- 例如,Spring AOP使用JDK动态代理和CGLIB生成代理类。
5. 模板方法模式(Template Method Pattern)
模板方法模式定义了算法的骨架,而将某些步骤的实现延迟到子类中。Spring中的JdbcTemplate、HibernateTemplate、JmsTemplate等类使用了模板方法模式。它们将公共的操作封装在模板类中,而将具体的业务操作由用户实现,从而避免了重复代码。
- 例如,
JdbcTemplate提供了一种执行数据库操作的统一方式,用户只需要关注SQL语句的编写,底层的数据库连接管理和异常处理由JdbcTemplate处理。
6. 观察者模式(Observer Pattern)
Spring框架中的事件机制(如ApplicationEvent和ApplicationListener)使用了观察者模式。Spring通过事件发布-订阅机制来解耦事件的发布者和监听者。当事件发生时,所有注册的监听器都会接收到事件通知,处理相应的业务逻辑。
- 例如,
ApplicationContext容器是事件源,而ApplicationListener是观察者,它们通过事件机制实现松耦合。
7. 策略模式(Strategy Pattern)
策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互相替换。Spring的HandlerMapping和HandlerAdapter等组件使用了策略模式。它们允许根据不同的请求类型选择不同的处理策略(如基于注解的控制器、基于XML的控制器等)。
- 例如,Spring MVC中的
HandlerMapping根据请求的URL选择合适的处理方法。
8. 装饰者模式(Decorator Pattern)
装饰者模式允许在不改变对象本身的情况下,动态地添加功能。Spring中的**AOP(面向切面编程)**实现了装饰者模式,切面类通过装饰目标对象,添加额外的功能(如事务管理、日志记录等),而不修改目标对象的代码。
- 例如,在Spring中,事务管理和日志记录是通过AOP切面动态地添加到Bean中的。
9. 适配器模式(Adapter Pattern)
适配器模式将一个类的接口转换成客户端期望的接口,使得不兼容的接口可以协同工作。Spring的HandlerAdapter就是一个适配器模式的例子。它适配了不同的处理器和请求方式,使得Spring MVC可以支持不同的控制器类型(如基于注解的控制器、基于XML的控制器等)。
- 例如,Spring MVC中的
HandlerAdapter适配不同的请求处理器。
10. 桥接模式(Bridge Pattern)
桥接模式通过将抽象和实现分离,使得两者可以独立变化。Spring中的数据源管理(如DataSource)和事务管理(如PlatformTransactionManager)使用了桥接模式,它们通过分离具体的数据库操作和事务管理逻辑,提高了灵活性和可扩展性。
- 例如,
JdbcTemplate和HibernateTemplate通过桥接模式将不同的数据访问技术封装起来,使得应用程序可以独立选择不同的实现。
11. 建造者模式(Builder Pattern)
建造者模式提供了一个用于构建复杂对象的接口,而将对象的创建过程分离出来。Spring中的**BeanDefinition和BeanDefinitionBuilder**使用了建造者模式,允许构建和配置复杂的Bean定义。
- 例如,
BeanDefinitionBuilder用于构建BeanDefinition,为Bean提供详细的配置。
12. 责任链模式(Chain of Responsibility Pattern)
责任链模式使得多个对象有机会处理请求,避免了请求发送者和接收者的耦合。Spring的HandlerInterceptor和Filter实现了责任链模式,允许多个拦截器或过滤器按顺序处理请求。
- 例如,Spring MVC中的
HandlerInterceptor链,允许多个拦截器按顺序处理请求。
总结
Spring框架巧妙地运用了多种设计模式,使得框架本身具有高内聚、低耦合、灵活可扩展等优点。Spring的设计模式不仅使开发者能够更方便地使用框架,还增强了框架的可维护性和可扩展性。
相关文章:
Spring框架中都用到了哪些设计模式?
大家好,我是锋哥。今天分享关于【Spring框架中都用到了哪些设计模式?】面试题。希望对大家有帮助; Spring框架中都用到了哪些设计模式? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring框架中使用了大量的设计模…...
LabVIEW 中 dotnet.llb 库功能
在 LabVIEW 功能体系里,位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform\dotnet.llb 路径下的 dotnet.llb 库意义重大。作为与 .NET 技术交互的关键库,它使 LabVIEW 用户能够与基于 .NET 框架开发的应用程序和组件进行交…...
C# 变量,字段和属性的区别
总目录 前言 在C#中,变量(Variables)、字段(Fields) 和 属性(Properties) 是三个容易混淆但作用截然不同的概念。以下是它们的核心区别与使用场景: 一、变量(Variables&…...
wordpress模板文件结构超详解
wordpress网站建设中,主题的制作是最为核心的环节。了解模板文件结构是模板制作的第一步,本文所讲的模板文件结构包括两部分,一是指以文件名为概念的文件结构,二是指文件内容的代码结构。 一、如何使模板文件起作用 ↑ wordpres…...
android studio下载安装汉化-Flutter安装
1、下载android studio官方地址:(这个网址可能直接打不开,需要VPN) https://developer.android.com/studio?hlzh-cn mac版本分为X86和arm版本,电脑显示芯片是Inter的就是x86的,显示m1和m2的就是arm的 …...
数据开放共享和平台整合优化取得实质性突破的智慧物流开源了
智慧物流视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本可通过边缘计算技术…...
如何设置 Nginx 连接超时并进行测试(Nginx优化)
🏡作者主页:点击! Nginx-从零开始的服务器之旅专栏:点击! 🐧Linux高级管理防护和群集专栏:点击! ⏰️创作时间:2025年2月15日14点22分 在高并发场景下,如…...
springboot整合mybatis-plus(保姆教学) 及搭建项目
一、Spring整合MyBatis (1)将MyBatis的DataSource交给Spring IoC容器创建并管理,使用第三方数据库连接池(Druid,C3P0等)代替MyBatis内置的数据库连接池 (2)将MyBatis的SqlSessionFactory交给Spring IoC容器创建并管理,使用spring-mybatis整…...
知识管理成功:关键指标和策略,研究信息的投资回报率
信息过载会影响生产力。没有人工智能的帮助,信息过载会影响生产力。大量的可用信息,知识工作者不仅仅是超负荷工作;他们感到不知所措,他们倾向于浪费时间(和脑细胞)来应付他们被大量的数据抛向他们…...
【算法】链表
零:链表常用技巧 1:引入虚拟头结点 (1)便于处理边界情况 (2)方便我们对链表操作 2:两步尾插,头插 (1)尾插 tail指向最后一个节点,tail.next…...
集成测试总结文档
1. 集成测试的定义 集成测试(Integration Testing)是在单元测试之后,将多个独立的软件模块或组件组合在一起进行测试的过程,目的是验证这些模块之间的接口、数据传递、协作逻辑是否符合设计要求,并发现因集成引发的缺…...
关于Dest1ny:我的创作纪念日
Dest1ny 因为这是csdn任务,我就稍微“写”了一下! 如果大家真的有什么想聊的或者想一起学习的,欢迎在评论区或者私信中与我讨论! 2025想说的话 我就把我想说的写在前面! 不用对未来焦虑,不要觉得自己走…...
Python爬虫-猫眼电影的影院数据
前言 本文是该专栏的第46篇,后面会持续分享python爬虫干货知识,记得关注。 本文笔者以猫眼电影为例子,获取猫眼的影院相关数据。 废话不多说,具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。接下来,跟着笔者直接往下看正文详细内容。(附带完整代码) …...
【计算机网络】传输层数据段格式
在计算机网络中,数据段(Segment) 是传输层协议(如 TCP 或 UDP)使用的数据单元。TCP 和 UDP 的数据段格式有所不同,以下是它们的详细说明: 1. TCP 数据段格式 TCP(传输控制协议&…...
nsc account 及user管理
从安全角度,推荐使用sign 模式进行nats account及用户管理 把权限放到account level 用户密码泄露可以通过快速更换用户可以设置过期日期,进行安全轮换 此外通过nsc 管理用户和权限,可以统一实现全局管控,包括subject管控&#…...
晶闸管主要参数分析与损耗计算
1. 主要参数 断态正向可重复峰值电压 :是晶闸管在不损坏的情况下能够承受的正向最大阻断电压。断态正向不可重复峰值电压 :是晶闸管只有一次可以超过的正向最大阻断电压,一旦晶闸管超过此值就会损坏,一般情况下 反向可重复峰值电压 :是指晶闸管在不损坏的情况下能够承受的…...
.net6 mvc 获取网站(服务器端)的IP地址和端口号
注意:是网站的,服务端的 IP地址, 不是当前用户电脑的、本地的IP地址 两个图: 分析: var AbsolutePath HttpContext.Request.Url.AbsolutePath;//"/Meeting/GetLastMeetingOL"var AbsoluteUri HttpContext.…...
坐井说天阔---DeepSeek-R1
前言 DeepSeek-R1这么火,虽然网上很多介绍和解读,但听人家的总不如自己去看看原论文。于是花了大概一周的时间,下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…...
数据结构与算法——快速排序
快速排序 一、核心原理:分治策略 1、选一个基准元素, 2、两个指针往中间遍历,比基准值小的移到一边,比基准值大的移到另一边, 一轮遍历后,指针相交位置就是基准值应该放置的位置,同时数组也…...
Node.js技术原理分析系列——Node.js调试能力分析
本文由体验技术团队屈金雄原创。 Node.js 是一个开源的、跨平台的 JavaScript 运行时环境,它允许开发者在服务器端运行 JavaScript 代码。Node.js 是基于 Chrome V8引擎构建的,专为高性能、高并发的网络应用而设计,广泛应用于构建服务器端应…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
