Spring框架的设计模式

Spring 框架深度集成了多种经典设计模式,这些模式支撑了其核心功能(如IoC、AOP)的实现,以下是关键模式及其应用场景的梳理:

1、工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑。并且是通过使用一个共同的接口来指向新创建的对象。Spring 中可以使用工厂模式通过 BeanFactory 或者 ApplicationContext 创建 Bean 对象。BeanFactory 和 ApplicationContext 是核心工厂接口,封装 Bean 的创建逻辑;FactoryBean 扩展工厂能力,支持复杂对象(如 SqlSessionFactoryBean)的定制化构建。

2、单例模式

单例模式是指一个类全局只有一个实例,Spring 框架中默认的 Bean 是单例的。Spring 容器默认以单例作用域管理 Bean(@Scope("singleton")),避免重复创建无状态对象(如 Service、DAO 层组件),减少资源消耗。底层是通过 ConcurrentHashMap 注册表管理单例实例。

面试题:Spring 框架管理的 Bean 使用单例模式,是如何解决线程安全问题?

答:(1)通过使用 ThreadLocal 实现线程隔离,ThreadLocal 会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。

(2)若需共享可变状态,则显式使用 ConcurrentHashMap、AtomicInteger 等线程安全容器,或通过 synchronized/ReentrantLock 同步关键代码块。

3、适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。例如,旧的接口规范和新的接口调用方式不兼容,在这种情况下,可以在中间添加一个适配器,适配器提供新的接口调用方式,但是在内部使用的是旧的接口。Spring AOP 模块对 BeforeAdvice、AfterAdvice 和 ThrowsAdvice 三种通知类型的支持实际上是借助适配器模式来实现的。

4、装饰器模式

装饰器模式是指动态给一个对象添加一些额外的职责,就增加功能来说,装饰者比继承更加灵活。例如,已经有个登录功能,需要添加一个新功能,登录的时候发送短信通知。Spring 中用到的装饰器模式在类名上有两种表现:一种是类名中含有 Wrapper,另一种是类名中含有 Decorator。基本上都是动态地给一个对象添加一些额外的职责。

5、代理模式

代理模式是指一个类代表另一个类的功能,Spring 的 AOP 实现基本上都是通过代理模式,代理模式和装饰器模式实现方法很类似,它们的区别是装饰器模式是对现有功能的扩展,代理模式是完成其他的功能。例如登录的时候发送短信是对登录功能的扩展,是装饰器模式,如果登录之前需要网络检查,请求签名是通过代理实现。

6、观察者模式

观察者模式又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自行更新。Spring 中的 ApplicationListener 就是使用的观察者模式。

7、模板方法模式

模板方法模式是类的行为模式。先准备一个抽象类,将部分逻辑以具体方法以及具体构造方法的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。Spring 以 Template 结尾都是模板方法,例如数据库访问的类 JdbcTemplate 和 HTTP 请求的类 RestTemplate。

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

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

相关文章

git报错fatal: 远端意外挂断了

git报错fatal: 远端意外挂断了 报错详细内容 mr.mbogon tinymce % git add . mr.mbogon tinymce % git commit -m init [master c6cfc2a] init1 file changed, 2 insertions(), 1 deletion(-) mr.mengbogon tinymce % git push 枚举对象中: 241, 完成…

Windows 下安装 NVM

NVM 下载 NVM 在工作中,你可能遇到过某个项目需要高版本的 node 才能运行,而有的项目可能只支持低版本的 node,此时就可以借助于一些 Node 版本管理工具,比如 nvm(Node Version Manager),帮助…

AI知识补全(十七):通用人工智能AGI是什么?

名人说:博观而约取,厚积而薄发。——苏轼《稼说送张琥》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:AI知识补全(十六):A2A - 谷歌开源的agent通信协议是什么? 目录 一、什么是AGI?概念解析1. 什么是AGI2. AGI与现有AI的本质区别二 、AGI的核…

Spring Cloud Gateway 介绍

什么是Spring Cloud Gateway? Spring Cloud Gateway 是 Spring Cloud 社区官方推出的一个基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.x 的下一代 API 网关(API Gateway)解决方案。它旨在为微服务架构提供统一、简洁、高效的…

slam--高斯分布

教程 博主解释 高斯分布 高斯分布(Gaussian Distribution),又称正态分布(Normal Distribution),是描述连续型随机变量分布规律的一种概率分布。 (1) 一维高斯分布 μ:均值/数学期望&#xff0…

机器视觉标定讲解

B站 :道传科技上位机 观看教程 一、什么是相机标定 相机标定(Camera Calibration)是指通过实验或算法手段确定相机的内部参数(如焦距、主点坐标、畸变系数)和外部参数(如旋转矩阵、平移向量&#xff0…

文件的秒传、分片上传以及断点续传 || Redis缓存减轻数据库读写压力

实现文件的秒传、分片上传以及断点续传的功能。使用 Redis 缓存上传的文件分片信息减轻数据库读写压力,同时防止有人恶意攻击服务器导致服务器磁盘爆满无法提供服务。 🔍 详解: 1. 实现文件的秒传、分片上传以及断点续传功能 秒传&#xff0…

安全大模型智驱网络和数据安全效能跃迁

从2023年ChatGPT开始,网络安全行业就一直尝试和AI大模型来结合,解决网络安全的痛点,例如告警多,专家少,新的APT攻击层出不穷,已有的基于规则的防护手段失灵,如何使用大模型的泛化能力来提升对未…

Android S - 恢复部分应用安装

使用展锐提供的代码编译出来的固件&#xff0c;不包含DeskClock等应用。 之前也遇到过这个情况&#xff0c;只是时间太久忘记了&#xff0c;在这里再次记录&#xff01; frameworks/native/data/etc/android.app.remove.xml<?xml version"1.0" encoding"ut…

android 之 CALL

一、组件职责与定位 组件所在进程核心职责关键特性CallsManagerTelecom系统进程通话状态机核心&#xff1a;管理所有Call对象的生命周期&#xff08;创建、状态更新、销毁&#xff09;。监听Call状态变化并通知所有观察者&#xff08;如InCallController&#xff09;。通过mLi…

Swift 6 学习笔记(二)The Basics

这篇笔记也是同步 Swift 6 官方教程中的第二篇 《The Basics》&#xff0c;这篇博客中的大部分内容在第一篇中已经涉及&#xff0c;这篇可以被认为是基础类型的的补充篇&#xff0c;多了很多说明信息。 官方教学文档 《The Basics》&#xff1a; Swift 提供了许多基本数据类型…

【PHP】BC Math 函数参考表

BC Math 函数参考表: 函数名描述语法bcadd两个任意精度数字的加法bcadd($num1, $num2, [scale])bcsub两个任意精度数字的减法bcsub($num1, $num2, [scale])bcmul两个任意精度数字乘法bcmul($num1, $num2, [scale])bcdiv两个任意精度数字除法bcdiv($num1, $num2, [scale])bcmod…

C# TAP异步编程(Task/async/await)总结

C#中有个很好用的东西&#xff0c;TAP异步编程&#xff08;Task-based Asynchronous Pattern&#xff09;&#xff0c;是目前C#推荐的异步编程模型。它基于 System.Threading.Tasks.Task 和 async/await 关键字&#xff0c;旨在简化异步代码的编写、调试和维护。TAP 是现代 .NE…

达梦数据库(DM)用户名大小写处理规则

达梦数据库(DM)用户名大小写处理规则 达梦数据库对用户名的处理与PostgreSQL和Oracle有所不同&#xff0c;以下是相关说明&#xff1a; 一、基本规则 默认情况下&#xff1a;达梦数据库区分用户名大小写 创建的用户名会保留原始大小写格式连接时必须使用相同的大小写形式 …

黑马点评面试话术

文章目录 1.项目介绍2. 分布式登录功能2.1 讲讲登录的整个流程2.2 集群模式session下存储用户信息会有啥问题&#xff1f;2.3 为什么采用redis存储用户信息和验证码2.4 redis的存储格式怎么样的&#xff1f;2.5 为什么采用Hash结构存储用户信息2.6 为什么采用双拦截器&#xff…

MTK APEX测光系统中各变量具体的计算方式探究

目录 一、APEX测光系统介绍 二、MTK测光系统实例介绍 三、关于测光系统的一些疑问 一、APEX测光系统介绍 详细内容可以参考; AE(自动曝光)系统简介

K8S的基本概念

Kubernetes是一个开源的容器编排部署管理平台,用于管理云平台中多个主机上的容器化应用。Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署、规划、更新、维护的一种机制。 对应用开发者而言,可以把Kubernetes看成一个集群操作系统。Kubernetes…

NLP学习路线图(三十四): 命名实体识别(NER)

一、命名实体识别(NER)是什么? 命名实体识别(Named Entity Recognition, NER)是自然语言处理中的一项关键序列标注任务。其核心目标是从非结构化的文本中自动识别出特定类别的名词性短语,并将其归类到预定义的类别中。 核心目标:找到文本中提到的命名实体,并分类。 典…

大三自学笔记:探索Hyperlane框架的心路历程

## Day 1&#xff1a;初识 Hyperlane 在 GitHub 上发现了 Hyperlane 这个 Rust HTTP 框架&#xff0c;立刻被它的性能数据吸引。官方文档写着&#xff1a; > "hyperlane 是一个高性能且轻量级的 Rust HTTP 框架&#xff0c;设计目标是简化现代 Web 服务的开发&#xff…

Java大厂面试真题:谢飞机的技术挑战

Java大厂面试真题&#xff1a;谢飞机的技术挑战 场景一&#xff1a;电商场景 面试官&#xff1a;在电商项目中&#xff0c;我们通常需要处理大量的并发请求。请谈谈你对JVM调优的理解。 谢飞机&#xff1a;嗯&#xff0c;JVM调优主要是为了提高程序的性能和稳定性。比如&…