Spring中用了哪些设计模式?

Spring框架广泛应用了多种设计模式,以实现其灵活性、可扩展性和可维护性。以下是一些在Spring中常见的设计模式及其应用示例:

1. 单例模式(Singleton Pattern)
Spring中的Bean默认都是单例的,这意味着在整个应用上下文中,每个Bean定义只有一个实例。

@Service
public class SingletonService {// 单例Bean的实现
}

2. 工厂模式(Factory Pattern)
Spring使用BeanFactory和ApplicationContext接口来创建和管理Bean实例,这是工厂模式的典型应用。

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyService myService = context.getBean(MyService.class);

3. 代理模式(Proxy Pattern)
Spring AOP(面向切面编程)通过代理模式实现,可以在不修改原有代码的情况下增强功能。

@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Executing: " + joinPoint.getSignature().getName());}
}

4. 模板方法模式(Template Method Pattern)
Spring提供了多种模板类,如JdbcTemplate、RestTemplate等,这些模板类定义了一套固定的流程,但允许子类重写某些步骤。

public class JdbcCustomerDao {private JdbcTemplate jdbcTemplate;public void setDataSource(DataSource dataSource) {this.jdbcTemplate = new JdbcTemplate(dataSource);}public Customer getCustomerById(int id) {return jdbcTemplate.queryForObject("SELECT * FROM customers WHERE id = ?", new Object[]{id}, new CustomerRowMapper());}
}

5. 观察者模式(Observer Pattern)
Spring的事件机制基于观察者模式,允许应用组件监听和响应特定事件。

public class CustomApplicationListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {System.out.println("Application context has been initialized or refreshed.");}
}

6. 策略模式(Strategy Pattern)
Spring的依赖注入机制允许开发者灵活地选择和切换不同的实现策略。

public interface PaymentStrategy {void pay(int amount);
}@Service
public class CreditCardPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paid with credit card: " + amount);}
}@Service
public class PayPalPayment implements PaymentStrategy {@Overridepublic void pay(int amount) {System.out.println("Paid with PayPal: " + amount);}
}

7. 装饰器模式(Decorator Pattern)
Spring Security中的认证和授权机制使用了装饰器模式,通过层层包装来增强功能。

public class CustomAuthenticationProvider implements AuthenticationProvider {@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {// 自定义认证逻辑return authentication;}@Overridepublic boolean supports(Class<?> authentication) {return true;}
}

8. 适配器模式(Adapter Pattern)
Spring MVC中的HandlerAdapter接口允许不同的控制器实现以统一的方式被调用,这是适配器模式的体现。

public class SimpleControllerHandlerAdapter implements HandlerAdapter {@Overridepublic boolean supports(Object handler) {return (handler instanceof Controller);}@Overridepublic ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return ((Controller) handler).handleRequest(request, response);}@Overridepublic long getLastModified(HttpServletRequest request, Object handler) {return -1;}
}

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

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

相关文章

FastAPI(六十五)实战开发《在线课程学习系统》基础架构的搭建

在之前三篇&#xff0c;我们分享的就是需求的分析&#xff0c;基本接口的整理&#xff0c;数据库链接的配置。这次我们分享项目的基本框架&#xff0c;目录结构大致如下&#xff1a; common目录&#xff1a; 通用目录&#xff0c;放一些通用的处理 models目录&#xf…

比较HTTP/1.1、HTTP/2

HTTP/1.1和HTTP/2是两个不同版本的超文本传输协议&#xff08;HTTP&#xff09;&#xff0c;它们在多个方面存在显著的差异。以下是对这两个协议的比较&#xff1a; 一、连接管理 HTTP/1.1&#xff1a; 使用持久连接&#xff08;Persistent Connections&#xff09;&#xff…

【基础】模拟题 角色授权类

3413. DHCP服务器 题目 提交记录 讨论 题解 视频讲解 动态主机配置协议&#xff08;Dynamic Host Configuration Protocol, DHCP&#xff09;是一种自动为网络客户端分配 IP 地址的网络协议。 当支持该协议的计算机刚刚接入网络时&#xff0c;它可以启动一个 DHCP 客户…

【Git远程操作】克隆远程仓库 https协议 | ssh协议

目录 前言 克隆远程仓库https协议 克隆远程仓库ssh协议 前言 这四个都是Git给我们提供的数据传输的协议&#xff0c;最常使用的还是https和ssh协议。本篇主要介绍还是这两种协议。 ssh协议&#xff1a;使用的公钥加密和公钥登录的机制&#xff08;体现的是实用性和安全性&am…

Nginx的HA高可用的搭建

1. 什么是高可用 高可用&#xff08;High Availability, HA&#xff09;是一种系统设计策略&#xff0c;旨在确保服务或应用在面对硬件故障、软件缺陷或任何其他异常情况时&#xff0c;仍能持续稳定地运行。它通过实现冗余性、故障转移、负载均衡、数据一致性、监控自动化、预防…

【无线通信】射频杂散(RF Spurious Emissions)

射频杂散&#xff08;RF Spurious Emissions&#xff09;是指在无线通信系统中&#xff0c;除了在指定频率范围内的预期信号之外&#xff0c;任何不需要的或非预期的射频信号。这些杂散信号可能会干扰其他通信系统&#xff0c;降低系统性能&#xff0c;并违反无线电通信法规。射…

掌握构建艺术:在Gradle中配置自定义的源代码管理(SCM)

掌握构建艺术&#xff1a;在Gradle中配置自定义的源代码管理&#xff08;SCM&#xff09; 在软件开发过程中&#xff0c;源代码管理&#xff08;Source Code Management&#xff0c;简称SCM&#xff09;是不可或缺的一部分。它帮助开发者管理代码的变更历史&#xff0c;支持团…

Go网络编程-HTTP程序设计_2

HTTP程序设计 Go编写HTTP服务器&#xff0c;用 Go实现一个 http server非常容易&#xff0c;Go 语言标准库 net/http自带了一系列结构和方法来帮助开发者简化 HTTP 服务开发的相关流程。因此&#xff0c;我们不需要依赖任何第三方组件就能构建并启动一个高并发的 HTTP 服务器。…

React Router 6笔记

一个路由就是一个映射关系 key为路径&#xff0c;value可能是function或component 路由分类 后端路由&#xff08;node&#xff09; value是function&#xff0c;用来处理客户端提交的请求注册路由&#xff1a;router.get(path, function(req, res))工作过程&#xff1a;当…

Java并发04之线程同步机制

文章目录 1 线程安全1.1 线程安全的变量1.2 Spring Bean1.3 如果保证线程安全 2 synchronized关键字2.1 Java对象头2.1.1 对象组成部分2.1.2 锁类型2.1.3 锁对象 2.2 synchronized底层实现2.2.1 无锁状态2.2.2 偏向锁状态2.2.3 轻量级锁状态2.2.4 重量级锁2.2.5 锁类型总结2.2.…

C++11 容器emplace方法刨析

如果是直接插入对象 push_back()和emplace_back()没有区别但如果直接传入构造函数所需参数&#xff0c;emplace_back()会直接在容器底层构造对象&#xff0c;省去了调用拷贝构造或者移动构造的过程 class Test { public:Test(int a){cout<<"Test(int)"<<…

链表(4) ----跳表

跳表&#xff08;Skip List&#xff09;是一种随机化的数据结构&#xff0c;用于替代平衡树&#xff08;如 AVL 树或红黑树&#xff09;。它是基于多层链表的&#xff0c;每一层都是上一层的子集。跳表可以提供与平衡树相似的搜索性能&#xff0c;即在最坏情况下&#xff0c;搜…

zlgcan,周立功Can设备,Qt中间件,QtCanBus插件,即插即用

新增zlgcan插件&#xff0c;需要请看下方视频回复联系&#xff01; 视频链接地址&#xff1a; Qt,canbus manager,周立功,zlgcan插件演示,需要请留言_哔哩哔哩_bilibili

反爬虫策略中的IP地址轮换如何实现?挑战与对策

当今互联网时代&#xff0c;各类网站、网络平台背后隐藏着大量数据&#xff0c;广告数据收集、市场数据收集都需要依托爬虫技术&#xff0c;但很多网站通过反爬虫技术限制或屏蔽爬虫的访问&#xff0c;这给数据收集带来不小的挑战。 为了规避这些反爬虫策略&#xff0c;开发人…

JVM--内存分配与回收策略

1.前言 对象的内存分配&#xff0c;从概念上讲&#xff0c;应该都是在堆上分配&#xff08;而实际上也有可能经过即时编译后被拆散 为标量类型并间接地在栈上分配 &#xff09;。在经典分代的设计下&#xff0c;新生对象通常会分配在新生代中&#xff0c;少数 情况下&#xff0…

计数,桶与基数排序

目录 一. 计数排序 概念 步骤思路如下 实现代码如下 时间复杂度与空间复杂度 1. 时间复杂度 2. 空间复杂度 计数排序的特点 二. 桶排序 概念 步骤思路如下 实现代码如下 时间复杂度与空间复杂度 1. 时间复杂度 2. 空间复杂度 桶排序的特点 三. 基数排序 概念 步…

Java核心API——Collection类

Collection类简介 * java集合框架 * java.util.Collection接口&#xff0c;是所有集合的顶级接口&#xff0c;规定了集合所必须的功能 * <p> * 集合与数组一样&#xff0c;可以保存一组具有相同类型元素数据结构 * 并且提供了对于元素的维护操作(方法)。 * 集合有多种不…

千万罚单,稠州商业银行屡教不改?

撰稿|芋圆 来源|贝多财经 今年&#xff0c;浙江稠州商业银行&#xff08;以下简称“稠州商行”&#xff09;似乎进入了多事之秋&#xff0c;刚刚兼并两家经营不善的村镇银行就紧接着收到大额罚单。 该行在2023年的经营业绩不算难看。据2023年年报&#xff0c;稠州商行的业绩从…

PHP 调用 1688 详情 API 接口的实战攻略

在电商领域&#xff0c;获取准确和详细的商品信息对于业务的发展至关重要。1688 作为国内知名的批发采购平台&#xff0c;其详情 API 接口为开发者提供了丰富的数据资源。本文将为您详细介绍如何使用 PHP 调用 1688 详情 API 接口。 一、前期准备 注册 1688 开放平台账号&#…

L2TP(Client-initiated模式)over IPSEC远程拨号实验

一、实验目的及拓扑 实验目的&#xff1a;通过L2TP客户端与LNS服务端建立L2TP隧道并承载在IPSEC网络上。其中L2TPoverIPsec客户端采用windows软终端模式&#xff08;Cloud3&#xff09;&#xff0c;AR1上将内网LNS&#xff08;FW1&#xff09;服务器采用NAT方式向外网进行映射…