Spring中用到的设计模式详解

        Spring 在设计和实现过程中大量使用了设计模式,这些设计模式不仅提升了 Spring 的灵活性和可扩展性,还为开发者提供了更高效、更优雅的编程方式。以下是 Spring 框架中使用的一些常见设计模式:

1. 单例模式(Singleton Pattern)

  • 定义:确保一个类只有一个实例,并提供全局访问点。

  • Spring 应用

    • Spring 默认将 Bean 的作用域设置为单例(singleton),由 IOC容器管理生命周期。

  • 示例

    @Service  // 默认就是单例
    public class OrderService {// 业务逻辑
    }

2. 工厂模式(Factory Pattern)

  • 定义:通过工厂类封装对象的创建逻辑,解耦客户端与具体实现。

  • Spring 应用

    • BeanFactory 和 ApplicationContext 是核心工厂,负责创建和管理 Bean。

    • FactoryBean 接口允许自定义复杂对象的创建逻辑(如 MyBatis 的 SqlSessionFactoryBean)。

  • 优点:将对象的创建和使用分离,降低了耦合度。

  • 示例

    // BeanFactory 是一个工厂接口
    BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("applicationContext.xml"));
    SingletonBean singletonBean = beanFactory.getBean(SingletonBean.class);

3. 代理模式(Proxy Pattern) 

  • 定义:通过代理对象控制对真实对象的访问。

  • Spring 应用:

    • 接口代理:使用JDK动态代理(基于接口)

    • 类代理:使用CGLIB字节码生成

  • 应用场景

    • AOP切面编程

    • 声明式事务管理

    • @Async异步方法

  • 示例

    @Transactional  // 通过代理实现事务管理
    public void placeOrder(Order order) {// 业务逻辑
    }

4. 模板方法模式(Template Method Pattern) 

  • 定义:定义算法骨架,将某些步骤延迟到子类实现

  • Spring 应用

    • JdbcTemplateRestTemplate 等模板类封装了资源管理(如连接、异常处理),用户只需实现回调。

  • 示例

    public class JdbcTemplateExample {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<String> getNames() {return jdbcTemplate.query("SELECT name FROM users",(rs, rowNum) -> rs.getString("name"));}
    }

5. 适配器模式(Adapter Pattern) 

  • 定义:将一个类的接口转换成客户希望的另一个接口。

  • 在 Spring 中的应用

    • HandlerAdapter:适配不同风格的控制器(如Servlet、注解式控制器)

    • AOP中的适配器:将各种Advice适配为MethodInterceptor

    • 安全配置适配器

  • 示例

    // 将一个普通POJO适配为Spring MVC控制器
    @Controller
    public class SimpleController {@RequestMapping("/hello")public String hello() {return "greeting";}
    }

6. 观察者模式(Observer Pattern) 

  • 定义:对象间一种一对多的依赖关系,当一个对象状态改变时,所有依赖于它的对象都会得到通知并自动更新。

  • 在 Spring 中的应用

    • 事件驱动模型:通过 ApplicationEvent(事件)和 ApplicationListener(监听器)实现。如 ContextRefreshedEvent(容器刷新完成事件)。

  • 示例

    // 定义事件
    public class CustomEvent extends ApplicationEvent {public CustomEvent(Object source) {super(source);}
    }// 监听事件
    @Component
    public class CustomEventListener implements ApplicationListener<CustomEvent> {@Overridepublic void onApplicationEvent(CustomEvent event) {// 处理事件}
    }// 发布事件
    applicationContext.publishEvent(new CustomEvent(this));

7. 策略模式(Strategy Pattern) 

  • 定义:定义一系列的算法,把它们一个个封装起来,并使它们可互换。

  • 在 Spring 中的应用

    • 资源加载Resource 接口的不同实现(ClassPathResourceUrlResource)。

    • 事务管理:支持多种事务策略(JDBC、JTA)

  • 示例

    Resource resource = new ClassPathResource("applicationContext.xml");
    Resource resource2 = new FileSystemResource("/conf/applicationContext.xml");

 8. 装饰器模式(Decorator Pattern)

  • 定义:动态地给一个对象添加额外的职责。

  • 在 Spring 中的应用HttpServletRequestWrapper装饰HTTP请求。

  • 示例

    public class CustomRequestWrapper extends HttpServletRequestWrapper {public CustomRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {// 装饰原始方法String value = super.getParameter(name);return value != null ? value.toUpperCase() : null;}
    }

9. 责任链模式 (Chain of Responsibility Pattern)

  • 定义:允许将请求沿着处理链传递,直到有一个处理者能够处理它为止。该模式通过为多个处理者提供处理请求的机会,从而解耦请求的发送者和接收者。

  • 在 Spring 中的应用

    • Spring Security的过滤器链

    • Spring MVC的拦截器链

  • 示例

    public class SecurityFilterChain {private List<Filter> filters;public void doFilter(ServletRequest request, ServletResponse response) {// 依次调用过滤器}
    }

10. 组合模式(Composite Pattern)

  • 定义:将对象组合成树形结构以表示“部分-整体”的层次结构。

  • 在 Spring 中的应用

    • Spring表达式语言(SpEL)中的表达式组合

    • CompositeCacheManager组合多个缓存管理器

  • 示例

    public class CompositeCacheManager implements CacheManager {private List<CacheManager> cacheManagers;// 组合多个CacheManager的功能
    }

11. 建造者模式(Builder Pattern) 

  • 定义:逐步构造一个复杂的对象,并允许用户只通过指定复杂对象的类型和内容就能构建它们。

  • 在 Spring 中的应用

    • BeanDefinitionBuilder用于构建Bean定义

    • UriComponentsBuilder用于构建URI

  • 示例

    BeanDefinition beanDefinition =  BeanDefinitionBuilder.genericBeanDefinition(MyBean.class)
    .addPropertyValue("name", "Kimi");
    .addPropertyValue("age", 25);
    .getBeanDefinition();

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

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

相关文章

Typescript学习教程,从入门到精通,TypeScript 集合类型语法知识点及案例代码(11)

TypeScript 集合类型语法知识点及案例代码 TypeScript 提供了多种集合类型&#xff0c;用于存储和管理数据。以下将详细介绍 数组&#xff08;Array&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09; 和 映射&#xff08;Map&#xff09;&am…

在 Win 10 上,Tcl/Tk 脚本2个示例

参阅&#xff1a;Tcl/Tk 教程 set PATH 新增 D:\Git\mingw64\bin where tclsh D:\Git\mingw64\bin\tclsh.exe where wish D:\Git\mingw64\bin\wish.exe 编写 test_tk.tcl 如下 #!/usr/bin/tclsh # test 文件对话框 package require Tk# 弹出文件选择对话框&#xff0c;限…

Qt环境的搭建

Qt安装 Qt开发环境需要安装三个部分 1.C编译器(不是vs) 2.Qt SDK 3.需要一个Qt的集成开发环境 说是需要三个部分,但实际上是需要安装Qt SDK就足够了 QtSDK可以直接去官网下载 下载完成后需要配置一下环境变量 可以直接在系统中搜索"编辑系统环境变量" 为什么要…

Vue3中reactive响应式使用注意事项

Vue 3 的 reactive 是创建响应式对象的核心 API&#xff0c;但在使用过程中有一些需要注意的事项&#xff1a; 1&#xff1a;基本使用限制 仅对对象类型有效&#xff1a;reactive 只能用于对象类型&#xff08;Object、Array、Map、Set 等&#xff09;&#xff0c;不能用于原始…

STM32+rt-thread使用MQTT协议连接腾讯物联网平台

STM32rt-thread使用MQTT协议连接腾讯物联网平台 一、腾讯云sdk下载1、进入腾讯物联网平台文件[点击链接跳转](https://cloud.tencent.com.cn/document/product/1081/48356)2、下载csdk 二、移植腾讯云sdk1、将上面解压的文件夹复制到自己工程目录下2、文件添加到自己工程 三、连…

【MySQL成神之路】MySQL函数总结

以下是MySQL函数的全面总结&#xff0c;包含概念说明和代码示例&#xff1a; 一、MySQL函数分类 1. 字符串函数 -- CONCAT&#xff1a;连接字符串 SELECT CONCAT(Hello, , World); -- 输出 Hello World -- SUBSTRING&#xff1a;截取子串 SELECT SUBSTRING(MySQL, 2, 3…

JavaScript 异步编程、对象/数组操作

异步编程 JavaScript 是单线程语言&#xff0c;通过事件循环机制处理异步操作。任务分为两种&#xff1a; 宏任务(Macrotask): script整体代码、setTimeout&#xff08;时间结束执行&#xff09;、setInterval&#xff08;间隔执行&#xff09;、I/O、UI渲染 微任务(Microtas…

中小制造企业网络安全防护指南

考虑到文章内容较长&#xff0c;简要内容图片在文档末尾&#xff0c;请直接翻阅到底部查看 引言&#xff1a;中小制造企业面临的独特网络安全挑战 中小制造企业 (SME) 在当今数字化浪潮中扮演着至关重要的角色&#xff0c;然而&#xff0c;伴随技术进步而来的是日益严峻且独特…

es学习小结

1.​客户端类型​ ​推荐场景​ ​版本兼容性​ Elasticsearch Java API Client 新项目、ES 8.x集群 8.x及以上 Spring Data Elasticsearch Spring生态项目、简化ORM操作 ES 7.x-8.x&#xff08;需版本匹配&#xff09; Low-Level REST Client 需要底层HTTP控制、兼容多版本ES …

Axure项目实战:智慧运输平台后台管理端-订单管理2(多级交互)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:订单管理2 主要内容:中继器筛选、表单跟随菜单拖动、审批数据互通等 应用场景:订单管理…

2025年——ComfyUI_连接HuggingFace及更改缓存路径

本篇分享在 ComfyUI 中连接 huggingface 以及更改模型缓存路径。 我们在使用 ComfyUI 的一些插件时&#xff0c;有些必要模型只能通过连接 huggingface 来缓存才能让流程得以进行。但目前在上网不科学的情况下是无法打开 huggingface 网站的&#xff0c;好在国内有其镜像网站&a…

wx.getPrivacySetting接口needAuthorization一直返回false

我们在开发小程序的隐私协议授权时往往会使用到wx.getPrivacySetting接口&#xff0c;当返回的needAuthorization为true时候提示我们需要去授权&#xff0c;但你们有没有遇到过needAuthorization一直为false的情况呢&#xff0c;下面是最常见的三个解决方法&#xff0c;都完善了…

旅游信息检索

旅游信息检索 旅游信息检索是系统中实现数据获取和处理的关键环节&#xff0c;负责根据用户输入的目的地城市和出游天数&#xff0c;动态获取并生成高质量的旅游数据。 模块的工作流程分为以下几个阶段&#xff1a;首先&#xff0c;对用户输入的信息进行标准化处理&#xff0…

机器学习笔记【Week2】

一、多变量线性回归&#xff08;Multivariate Linear Regression&#xff09; 为什么需要多变量&#xff1f; 现实问题中&#xff0c;一个目标可能受多个因素影响&#xff0c;比如预测房价时&#xff1a; x 1 x_1 x1​&#xff1a;面积 x 2 x_2 x2​&#xff1a;卧室数量 x 3…

Axure 基本用法学习笔记

一、元件操作基础 1. 可见性控制 隐藏/显示&#xff1a;可以设置元件的可见性&#xff0c;使元件在特定条件下隐藏或可见 应用场景&#xff1a;创建动态交互效果&#xff0c;如点击按钮显示隐藏内容 2. 层级管理 层级概念&#xff1a;元件有上下层关系&#xff0c;上层元件…

aws平台s3存储桶夸域问题处理

当我们收到开发反馈s3存在跨域问题 解决步骤&#xff1a; 配置 S3 存储桶的 CORS 设置&#xff1a; 登录到 AWS 管理控制台。转到 S3 服务。选择你存储文件的 存储桶。点击 权限 标签页。在 跨域资源共享&#xff08;CORS&#xff09;配置 部分&#xff0c;点击 编辑。 登陆…

【后端高阶面经:微服务篇】7、1秒响应保障:超时控制如何成为高并发系统的“救火队长”?

一、全链路超时建模:从用户需求到系统分解 1.1 端到端时间预算分配 黄金公式: 用户期望响应时间 = 网络传输时间 + 服务处理时间 + 下游调用时间 + 缓冲时间典型分配策略(以1秒目标为例): 环节时间预算优化目标客户端渲染100ms骨架屏(Skeleton)预渲染边缘节点(CDN)…

前端遇到高并发如何解决重复请求

在前端开发中遇到高并发场景时&#xff0c;若不加控制容易出现重复请求&#xff0c;这可能导致接口压力增加、数据异常、用户体验变差等问题。以下是前端防止/解决重复请求的常见方法&#xff0c;按不同场景归类总结&#xff1a; &#x1f31f; 一、常见重复请求场景 用户频繁点…

老牌协议再升级,Ethernet IP转Modbus TCP网关桥接精准灌装系统

对于消费品包装制造商而言&#xff0c;灌装机是最关键且昂贵的设备之一。然而&#xff0c;许多公司却难以应对生产过程中的灌装波动&#xff0c;从而造成严重的财务和生产后果。 在本次网络研讨会中&#xff0c;我们将探讨稳联技术的ethernet ip转modbus tcp&#xff08;WL-ABC…

骰子游戏(2023睿抗省赛)

骰子游戏 题目描述: 在某个游戏中有一个骰子游戏。 在游戏中&#xff0c;你需要投掷 5 个标准六面骰子&#xff08;骰子为一个正方体&#xff0c;6个面上分别有 1、2、3、4、5、6中的一个数字&#xff0c;骰子的质量均匀&#xff09;&#xff0c;投出的点数根据组合会获得一…