Spring涉及的设计模式以及实际使用场景(含代码)

Spring涉及的设计模式以及实际使用场景(含代码)

1.工厂模式(Factory Pattern)

作用: 隐藏对象创建的细节,通过工厂类统一管理对象的实例化。

场景:Spring的BeanFactory和ApplicationContext是工厂模式的典型实现。

// 通过ApplicationContext获取Bean
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);// 自定义 FactoryBean
public class MyFactoryBean implements FactoryBean<MyObject> {@Overridepublic MyObject getObject() throws Exception {return new MyObject(); // 复杂对象的创建逻辑}@Overridepublic Class<?> getObjectType() {return MyObject.class;}
}

2.单例模式(Singleton Pattern)

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

场景:Spring默认的Bean的作用域为单例。

@Service // 默认 singleton
public class OrderService {// ...
}// 测试单例
OrderService bean1 = context.getBean(OrderService.class);
OrderService bean2 = context.getBean(OrderService.class);
System.out.println(bean1 == bean2); // 输出 true

3.代理模式(Proxy Pattern)

作用:通过代理对象控制对目标对象的访问,用于增强功能(AOP)

场景:Spring AOP通过动态代理实现日志,事务等功能。

@Aspect
@Component
public class LogAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("方法调用前: " + joinPoint.getSignature().getName());}
}// 使用 @Transactional 注解(基于代理实现事务)
@Transactional
public void transferMoney(Account from, Account to, double amount) {// 转账逻辑
}

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

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

场景:JdbcTemplate封装了JDBC的固定流程

@Autowired
private JdbcTemplate jdbcTemplate;public List<User> getUsers() {return jdbcTemplate.query("SELECT * FROM users",(rs, rowNum) -> new User(rs.getString("name"), rs.getInt("age")));
}

5.观察者模式(Observer Pattern)

作用:定义对象间的一对多依赖,当一个对象状态变化时,自动通知依赖它的对象。

场景:Spring事件监听机制


// 自定义事件
public class OrderEvent extends ApplicationEvent {public OrderEvent(String orderId) {super(orderId);}
}// 监听器
@Component
public class OrderEventListener implements ApplicationListener<OrderEvent> {@Overridepublic void onApplicationEvent(OrderEvent event) {System.out.println("处理订单事件: " + event.getSource());}
}// 发布事件
@Autowired
private ApplicationEventPublisher publisher;
public void createOrder() {publisher.publishEvent(new OrderEvent("ORDER_123"));
}

6.策略模式(Strategy Pattern)

作用:定义一系列算法,使其可以互相替换,独立于客户端发生变化

场景:Spring的ResourceLoader根据前缀选择资源加载策略

ResourceLoader loader = new DefaultResourceLoader();
Resource fileResource = loader.getResource("file:/tmp/test.txt");
Resource classpathResource = loader.getResource("classpath:application.yml");

7.适配器模式(Adapter Pattern)

作用:将一个接口转换成客户期待的接口

场景:Spring MVC 的 HandlerAdapter 适配不同 Controller。

// 模拟 SimpleControllerHandlerAdapter 的适配逻辑
public class SimpleControllerHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {return handler instanceof Controller;}@Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) {return ((Controller) handler).handleRequest(request, response);}
}

8.装饰器模式(Decorator Pattern)

作用:动态为对象添加额外职责

场景:Spring对HttpServletRequest的包装

// 自定义装饰器
public class LoggingRequestWrapper extends HttpServletRequestWrapper {public LoggingRequestWrapper(HttpServletRequest request) {super(request);}@Overridepublic String getParameter(String name) {System.out.println("获取参数: " + name);return super.getParameter(name);}
}// 在 Filter 中使用
public class LogFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {chain.doFilter(new LoggingRequestWrapper((HttpServletRequest) request), response);}
}

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

作用:将请求的发送者和接收者解耦,通过链式处理请求。

场景:Spring Security 的过滤器链。

// 模拟过滤器链
public class FilterChainDemo {private List<Filter> filters = new ArrayList<>();public void addFilter(Filter filter) {filters.add(filter);}public void doFilter(HttpServletRequest request) {for (Filter filter : filters) {filter.execute(request);}}
}// 使用
FilterChainDemo chain = new FilterChainDemo();
chain.addFilter(new AuthFilter());
chain.addFilter(new LoggingFilter());
chain.doFilter(request);

10.原型模式(prototype Pattern)

作用:通过复制现有对象来创建新对象,避免重复初始化开销

场景:Spring 的 prototype 作用域 Bean。

@Component
@Scope("prototype")
public class PaymentService {// 每次获取都是新实例
}// 测试
PaymentService bean1 = context.getBean(PaymentService.class);
PaymentService bean2 = context.getBean(PaymentService.class);
System.out.println(bean1 == bean2); // 输出 false

11.建造者模式(Builder Pattern)

作用:分步骤构建复杂对象

场景:RestTemplateBuilder构建复杂对象

RestTemplate restTemplate = new RestTemplateBuilder().rootUri("https://api.example.com").defaultHeader("Authorization", "Bearer token").build();

概括

  • 解耦:工厂模式、代理模式。
  • 扩展性:策略模式、观察者模式。
  • 复用性:模板方法模式、适配器模式。
  • 控制复杂度:责任链模式、装饰器模式。

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

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

相关文章

ROM 只读存储器 随机存取

ROM&#xff08;Read-Only Memory&#xff0c;只读存储器&#xff09;的存取方式为&#xff1a; ✅ 随机存取方式&#xff08;Random Access&#xff09; 尽管“ROM”强调的是“只读”&#xff0c;它的数据访问方式与 RAM 类似&#xff0c;都是随机存取。 &#x1f50d; 解释如…

opensuse解决微信无法登录的问题

思路启发 https://forum.suse.org.cn/t/topic/17183/2 实际解决 https://forum.suse.org.cn/t/topic/17204/5 解决方法 先安装 sudo zypper install execstackcd /opt/wechatsudo bash -c execstack -c ./*.so

Adixen ASM380 氦气检漏仪 阿尔卡特Mobile high performance helium leak detector

Adixen ASM380 氦气检漏仪 阿尔卡特Mobile high performance helium leak detector

堆的自动管理

由于程序员必须编写出到分配和释放存储器的明确的调用&#xff0c;所以用m a l l o c和f r e e完成指针的动态分配和重新分配是管理堆的手工( m a n u a l )方法。相反地&#xff0c;运行时栈则是由调用序列自动地( a u t o m a t i c a l l y )管理。在一种需要完全动态的运行…

智能出入库管理系统:自动化管控平台

部队装备库室智能管控系统是集智能化、集成化、网络化于一体的综合管理系统&#xff0c;由智慧营区库室综合管控平台、出入口控制子系统、智能QD柜子系统、装备物资管理子系统、视频监控系统、入侵报警子系统、环境监测子系统等七大核心子系统构成。各子系统通过数据自动交互&a…

归并排序:高效分治的艺术

归并排序(Merge Sort)原理详解 归并排序是一种基于分治法(Divide and Conquer)的高效排序算法,由冯诺依曼于1945年提出。它的核心思想是将大问题分解为小问题,解决小问题后再合并结果。 核心原理 1. 分治策略(Divide and Conquer) 分(Divide):将无序数组递归地拆…

知识库建设方案有哪些?全面解析

知识库建设方案主要包括本地部署方案、云端在线方案、混合部署方案。其中&#xff0c;云端在线方案以其灵活性、实时更新能力和低维护成本&#xff0c;逐渐成为大多数企业的首选方案。云端在线方案可随时随地提供实时更新的知识内容&#xff0c;确保企业员工和客户始终获得最新…

政务大厅智能引导系统:基于数字孪生的技术架构与实践

本文面向政务信息化开发者、系统集成工程师、智能导视领域技术人员。解析政务大厅智能引导系统的技术实现路径&#xff0c;提供从定位导航到数据驱动的技术方案&#xff0c;助力解决传统导视系统效率低下、体验不佳的技术痛点。 一、技术架构全景&#xff1a;从物理空间到数字映…

java设计模式[2]之创建型模式

文章目录 一 创建型模式1.1 单例模式的设计与实现1.1.1 饿汉式模式1.1.2 懒汉式单例模式1.1.3 懒汉式单例模式完善1.1.4 双重检测锁式1.1.4.1 volatile关键字1.1.4.2 在双重检查锁定中的作用 1.1.5 静态内部类式单例模式1.1.6 枚举式单例模式1.1.7 反射暴力破解解决方案1.1.8 序…

PHP设计模式实战:构建高性能API服务

在前一篇电子商务系统设计的基础上,我们将深入探讨如何运用设计模式构建高性能、可扩展的API服务。现代Web应用越来越依赖API作为前后端分离架构的核心,良好的API设计对系统性能和维护性至关重要。 仓库模式实现数据访问层 仓库模式(Repository Pattern)可以抽象数据访问逻…

ComfyUI Flux.1 ACE++ 图像编辑原理详解

关注不迷路&#xff0c;点赞走好运&#xff01;&#xff01;&#xff01; ComfyUI Flux.1 ACE 图像编辑原理详解 ——从“拼图游戏”到“魔法画笔”的技术革命 目录 ACE 的核心思想&#xff1a;用“指令”指挥图像生成 1.1 什么是上下文感知内容填充&#xff1f;1.2 条件单元&…

Datawhale-爬虫

task1-初始爬虫 爬虫用python好&#xff0c;python库多&#xff0c;功能全 反爬机制和反反爬机制 顾名思义&#xff0c;一个是防范爬虫的&#xff0c;一个是应对限制爬虫的方法 好的&#xff0c;我们来更深入地探讨反爬机制和反反爬策略的细节&#xff0c;包括具体的技术手段…

双token三验证(Refresh Token 机制​)

单token存在的问题 我们都知道&#xff0c;token是我们在前后端数据传输的时候为了保证安全从而必须需要进行设置的东西&#xff0c;他的主要作用实际上就是为了保证我们的数据安全&#xff0c;进行身份验证和授权&#xff0c;并且相对于session而言更加适合如今的分布式系统&a…

青少年编程与数学 01-011 系统软件简介 22 VMware 虚拟化软件

青少年编程与数学 01-011 系统软件简介 22 VMware 虚拟化软件 一、历史沿革&#xff08;一&#xff09;创立阶段&#xff08;1998-2003&#xff09;&#xff08;二&#xff09;快速扩张&#xff08;2004-2010&#xff09;&#xff08;三&#xff09;云时代转型&#xff08;2011…

FPGA基础 -- Verilog门级建模之奇偶校验电路

✅ 一、什么是奇偶校验&#xff08;Parity Check&#xff09; &#x1f4cc; 定义&#xff1a; 奇偶校验是一种错误检测编码方式&#xff0c;用于判断一个二进制数据在传输或存储过程中是否发生了单比特错误。 奇校验&#xff08;Odd Parity&#xff09;&#xff1a;总共有奇…

UWB协议精读:IEEE 802.15.4z-2020,15. HRP UWB PHY, STS, HRP-ERDEV, BPRF, HPRF,

跟UWB相关的IEEE标准主要有2个: 1,IEEE 802.15.4-2020 2,IEEE 802.15.4z-2020 IEEE Std 802.15.4z™ ‐ 2020 Amendment 1: Enhanced Ultra Wideband (UWB) Physical Layers (PHYs) and Associated Ranging Techniques scrambled timestamp sequence (STS): A sequence of…

6.IK分词器拓展词库

比如一些行业专业词汇、简单无意义词&#xff08;例如&#xff1a;的、得、地、是等)、网络流行词、后来形成的词、再或者一些禁忌词&#xff08;比如&#xff1a;领导人的名字、黄赌毒犯罪等词要排除的&#xff09; 在es的插件目录下查找配置文件&#xff1a; 找到IKAnalyzer…

Web3-Web3.js核心操作:Metamask、合约调用、事件订阅全指南

Web3-Web3.js核心操作&#xff1a;Metamask、合约调用、事件订阅全指南 我们做了Solidity的合约代码&#xff0c;但是合约仅仅是一个后端逻辑&#xff1b;我们想要让用户来操作你的逻辑还需要做一个基本的网页。如果要做一个基本的网页&#xff0c;我们就要使用到以太坊基金发布…

四色(定理/猜想)染色算法小软件Version1.11

四色(定理/猜想)染色算法小软件Version1.11 2025.6.16 开发者&#xff1a;路人甲/打酱油 增加了【自思肯普法】 为什么加上【自思】两字&#xff1f;因为我也看不明英文的PDF的四色定理证明文档&#xff0c;分什么成千上百种类来证明。我就是百度下&#xff0c;看相关介绍&am…

【Linux驱动开发 ---- 2_深入理解内核模块】

Linux驱动开发 ---- 2_深入理解内核模块 目录 Linux驱动开发 ---- 2_深入理解内核模块学习目标时间安排建议 理论学习1. 什么是内核模块&#xff1f;2. 模块加载与卸载3. 内核模块开发基础 实践任务任务1&#xff1a;准备开发环境任务2&#xff1a;编写简单内核模块任务3&#…