Spring设计模式

设计模式
是一种软件开发中的解决方案,设计原则。目的是使代码具有扩展性,可维护性,可读性,如:
-
单例模式(Singleton Pattern)
- Spring IoC 容器默认会将 Bean 创建为单例,保证一个类型的 Bean 在容器中只有一个实例。并提供一个全局的访问点来访问这个实例。单例模式的关键是控制类的实例化过程,确保系统中只存在一个实例,避免重复创建对象,节省系统资源。
public class Singleton {// 在类加载时就创建唯一实例private static final Singleton instance = new Singleton();// 私有构造函数,防止外部实例化private Singleton() {}// 提供公共的访问方法public static Singleton getInstance() {return instance;}public void showMessage() {System.out.println("Hello, I am a Singleton!");} }
- Spring IoC 容器默认会将 Bean 创建为单例,保证一个类型的 Bean 在容器中只有一个实例。并提供一个全局的访问点来访问这个实例。单例模式的关键是控制类的实例化过程,确保系统中只存在一个实例,避免重复创建对象,节省系统资源。
-
工厂模式(Factory Pattern)---一种创建模式
- Spring 容器本身就是一个 Bean 工厂(
BeanFactory),用于实例化和管理 Bean 对象。通过工厂模式,开发者无需关心 Bean 的创建过程。简单工厂模式:通过一个工厂类创建不同类型的对象,通常使用一个静态方法// 产品接口 public interface Vehicle {void drive(); }// 具体产品类 Car public class Car implements Vehicle {@Overridepublic void drive() {System.out.println("Driving a car!");} }// 具体产品类 Bike public class Bike implements Vehicle {@Overridepublic void drive() {System.out.println("Riding a bike!");} }// 工厂类,根据参数创建不同的产品实例 public class VehicleFactory {public static Vehicle createVehicle(String type) {if ("car".equalsIgnoreCase(type)) {return new Car();} else if ("bike".equalsIgnoreCase(type)) {return new Bike();} else {throw new IllegalArgumentException("Unknown vehicle type");}} }
- Spring 容器本身就是一个 Bean 工厂(
-
代理模式(Proxy Pattern)
- Spring AOP(面向切面编程)大量使用代理模式来实现方法拦截。例如,事务管理、日志记录、权限控制等功能就是通过动态代理来实现的。
-
模板方法模式(Template Method Pattern)
- Spring 中的模板类(如
JdbcTemplate、RestTemplate等)提供了模板方法模式,用于简化数据库操作、HTTP 调用等。开发者只需关注逻辑的实现,不必处理重复代码。要区别外观模式,模板方法模式的目的是定义一个算法的骨架,将一些步骤的实现延迟到子类中。模板方法模式通常包含一个模板方法,它定义了算法的执行顺序,而具体的步骤则由子类去实现。
- Spring 中的模板类(如
-
装饰器模式(Decorator Pattern)
- Spring Boot 中的
Filter链、HandlerInterceptor等使用了装饰器模式来增强功能,例如添加过滤条件或拦截请求。
- Spring Boot 中的
-
观察者模式(Observer Pattern)
- Spring 的事件机制使用观察者模式。通过
ApplicationEvent和ApplicationListener,可以在事件发布时通知所有监听器。它定义了对象间一种一对多的依赖关系,使得当一个对象(称为“被观察者”)的状态发生变化时,所有依赖于它的对象(称为“观察者”)都能够收到通知并自动更新。这个模式通常用于事件监听机制,是发布-订阅模式的一种实现
- Spring 的事件机制使用观察者模式。通过
-
责任链模式(Chain of Responsibility Pattern)
- Spring 的
Filter和Interceptor机制使用了责任链模式,将多个过滤器和拦截器串联起来,按顺序处理请求和响应。
- Spring 的
-
适配器模式(Adapter Pattern)
- Spring MVC 中的
HandlerAdapter使用了适配器模式,用于适配不同类型的请求处理器。比如可以支持@Controller和@RestController,也支持不同的返回类型。
- Spring MVC 中的
-
外观模式(Facade Pattern)
- Spring 提供了简化的接口来访问复杂的子系统,就说将复杂的系统用一个简单的外壳包装起来,你只需要会用这个简单的外壳进行了,比如
JdbcTemplate简化了 JDBC 操作的复杂过程,RestTemplate简化了 HTTP 调用。通常外观类只提供一个简化的接口,而不关心对象的具体行为。
- Spring 提供了简化的接口来访问复杂的子系统,就说将复杂的系统用一个简单的外壳包装起来,你只需要会用这个简单的外壳进行了,比如
-
原型模式(Prototype Pattern)
- Spring 容器中通过
@Scope("prototype")定义 Bean 为多例,每次注入时都会生成新的实例。通过复制现有的对象来创建新的对象,而不是通过构造函数来实例化新对象。适用于需要频繁创建新对象的场景。可通过实现cloneable接口实现。
- Spring 容器中通过
相关文章:
Spring设计模式
设计模式 是一种软件开发中的解决方案,设计原则。目的是使代码具有扩展性,可维护性,可读性,如: 单例模式(Singleton Pattern) Spring IoC 容器默认会将 Bean 创建为单例,保证一个类…...
信号保存和信号处理
目录 信号保存中重要的概念 内核中信号的保存 对sigset_t操作的函数 对block,pendding,handler三张表的操作 sigpromask 编辑 sigpending 是否有sighandler函数呢? 案例 信号处理 操作系统是如何运行的? 硬件中断 …...
网站小程序app怎么查有没有备案?
网站小程序app怎么查有没有备案?只需要官方一个网址就可以,工信部备案查询官网地址有且只有一个,百度搜索 "ICP备案查询" 找到官方gov.cn网站即可查询! 注:网站小程序app备案查询,可通过输入单位…...
如何利用宏和VBA来提高文档编辑排版速度?
一个真实的文档修改需求 为什么我会去研究VBA呢?主要原因是今年在一个项目里写了太多的文档。文档中很多操作其实都是机械的、重复的,但是偏偏又很耗时。举个例子,当时有这么一个修改需求,修改文档中所有“输入输出需求表格中”添…...
Kafka - 启用安全通信和认证机制_SSL + SASL
文章目录 官方资料概述制作kakfa证书1.1 openssl 生成CA1.2 生成server端秘钥对以及证书仓库1.3 CA 签名证书1.4 服务端秘钥库导入签名证书以及CA根证书1.5 生成服务端信任库并导入CA根数据1.6 生成客户端信任库并导入CA根证书 2 配置zookeeper SASL认证2.1 编写zk_server_jass…...
c++基础32输入和输出
输入和输出 C风格(使用printf和scanf)输出字符输入字符 C风格(使用cin和cout)输出字符输入字符 注意事项 在C和C中,字符的输入和输出可以通过多种方式实现,包括使用标准输入输出库函数如 printf和 scanf&…...
[C++] 函数详解
前言 今天zty带来的是函数的详解,搞了4个小时,大家给个赞呗,zty还要上学,发作品会少一点 先 赞 后 看 养 成 习 惯 先 赞 后 看 养 成 习 惯 先 赞 后 看 养 成 习 惯 演示用编译器及其…...
AMD CPU下pytorch 多GPU运行卡死和死锁解决
参考链接 https://medium.com/amitparekh/solving-ddp-deadlock-with-multiple-gpus-and-amd-cpus-442186632034 简要说明 AMD的IOMMU和NVIDIA的NCCL不兼容问题导致AMD的IOMMU是BIOS 级组件,它基本上充当将虚拟地址映射到 GPU 上的物理地址的接口,它的全部目的是让 CPU 和 G…...
Swift 开发教程系列 - 第12章:协议与协议扩展
协议(Protocol)是 Swift 的一种重要特性,它定义了实现特定功能的方法、属性或其他要求。通过协议,可以将行为定义从具体实现中分离,使代码更具可读性和扩展性。Swift 的协议支持协议扩展,这一特性允许我们为…...
麒麟V10,arm64,离线安装docker和docker-compose
文章目录 一、下载1.1 docker1.2 docker-compose1.3 docker.service 二、安装三、验证安装成功3.1 docker3.2 docker-compose 需要在离线环境的系统了里面安装docker。目前国产化主推的是麒麟os和鲲鹏的cpu,这块的教程还比较少,记录一下。 # cat /etc/ky…...
NUXT3学习日记二(样式配置、引入组件库、区分在服务端还是在客户端渲染)
上一章已经给大家分享官网下载的nuxt3了,下面正式进入我所要说的内容吧 一、初始化样式 想必大家从我的git下载下来的nuxt3,能看到nuxt.config.ts这个文件了吧。 这里我们有两种css配置方式 1、css:[~/assets/base.scss] 这种方式不能在scss文件中定义…...
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
基本概念 RTL(Register - Transfer - Level)视图:是一种硬件描述语言的抽象层次,用于描述数字电路中寄存器之间的数据传输和操作。在这个层次上,可以看到电路的基本结构,如寄存器、组合逻辑、多路复用器等…...
Javascript高级—闭包问题
闭包问题 循环中赋值为引用的问题 for (var i 1; i < 5; i) {setTimeout(function timer() {console.log(i)}, i * 1000) }解决方法有3种 第一种,使用立即执行函数方式 for (var i 1; i < 5; i) {(fuction(j){setTimeout(function timer() {console.log…...
C#入门 017 字段,属性,索引器,常量
字段,属性,索引器,常量都表示数据 字段 什么是字段 字段(field)是一种表示与对象或类型(类与结构体)关联的变量字段是类型的成员,又称“成员变量,写在类体里面与对象关联的字段亦称“实例字段,表示某个对…...
磐石云语音助手拦截介绍
呼叫中心用户实际应用场景下最高会有超过30%的和语音助手;无声主要是进入了语音信箱;如:“听到滴声后留言”,”漏话提醒““发送请按1,重录请按2”以及拨打过程中客户主动拒接产生的”您拨打的用户正忙“,”关机“”停…...
JSP执行过程及其与Servlet执行效率的比较
JSP(Java Server Pages)和Servlet都是Java Web开发中常用的技术,它们都用于动态生成Web页面。然而,JSP和Servlet在执行过程和效率上存在一些差异。本文将详细探讨JSP的执行过程,并比较JSP与Servlet的执行效率。 一、J…...
open3d
open3d open3d用于 3D 数据处理的现代库。 简介 Open3D 是一个开源库,支持快速开发处理 3D 数据的软件。Open3D 前端公开了一组精心挑选的 C 和 Python 数据结构和算法。后端经过高度优化,并设置为并行化。Open3D 是从零开始开发的,具有一更…...
Vue中优雅的使用Echarts的三种方式
一、原始方法直接使用 1、安装ECharts: npm install echarts --save 2、创建一个Vue公共组件 EChart.vue: <template><div :style"{width: 100%, height: 300px}" ref"chart"></div> </template><scri…...
SpringBoot配置文件/日志
目录 一,SpringBoot配置文件 1,配置文件的格式: 2,properties 3,yml 1,properties与yml的转换 2,读取配置选哪个中的内容 3,单双引号的差异: 4,配置对象: 5,配置集合/配置map 6,yml的优缺点: 二,验证码: 学习目的: 实现样例: 接口定义: 代码总结: 三,日志: 1,概…...
微服务架构面试内容整理-SpringCloud Netflix与Spring Cloud Alibaba比较
Spring Cloud Netflix 和 Spring Cloud Alibaba 都是用于构建微服务架构的解决方案,但它们在设计理念、组件和使用场景上存在一些差异。以下是它们的比较: 1. 服务注册与发现 ● Spring Cloud Netflix:使用 Eureka 作为服务注册和发现的组件。Eureka 是基于 REST 的,适合服…...
XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门  / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
