当前位置: 首页 > news >正文

Spring框架中使用的核心设计模式 及其 使用场景

目录:

  • 🧠 一、Spring 中使用的设计模式汇总
  • 🧩 二、详细设计模式解析与 Spring 应用
    • 1. 工厂模式(Factory Pattern)
    • 2. 单例模式(Singleton Pattern)
    • 3. 原型模式(Prototype Pattern)
    • 4. 代理模式(Proxy Pattern)
    • 5. 模板方法模式(Template Method Pattern)
    • 6. 策略模式(Strategy Pattern)
    • 7. 适配器模式(Adapter Pattern)
    • 8. 装饰器模式(Decorator Pattern)
    • 9. 观察者模式(Observer Pattern)
    • 10. 委派模式(Delegate Pattern)
    • 11. 外观模式(Facade Pattern)
    • 12. 工厂方法模式(Factory Method Pattern)
  • 📌 三、Spring 设计模式使用场景总结
  • 🧪 四、常见面试题及答案
    • 1. Spring 中使用了哪些设计模式?
    • 2. Spring AOP 使用了什么设计模式?
    • 3. Spring 是如何实现单例的?
    • 4. 模板方法模式在 Spring 中的应用?
    • 5. 策略模式在 Spring 中的应用?
    • 6. 观察者模式在 Spring 中的应用?
    • 7. 装饰器模式在 Spring 中的应用?
  • 🧩 五、Spring 中设计模式的典型应用场景总结
  • 📦 六、设计模式对 Spring 架构的意义
  • 📚 七、推荐学习资料
  • ✅ 八、总结:Spring 中设计模式的核心作用
  • 📄 九、完整代码示例(Spring 中使用设计模式)
    • 1. 工厂模式:BeanFactory 和 ApplicationContext
    • 2. 代理模式:Spring AOP
    • 3. 模板方法模式:JdbcTemplate
    • 4. 策略模式:Resource 接口
    • 5. 观察者模式:ApplicationEvent 和 ApplicationListener
  • 📌 十、Spring 设计模式应用总结表

🧠 一、Spring 中使用的设计模式汇总

在这里插入图片描述

🧩 二、详细设计模式解析与 Spring 应用

1. 工厂模式(Factory Pattern)

  • 使用场景:解耦对象的创建与使用。
  • Spring 应用:BeanFactory 和 ApplicationContext 是典型的工厂模式实现。
  • 示例代码:
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);

2. 单例模式(Singleton Pattern)

  • 使用场景:确保全局只有一个实例(如数据库连接池)。
  • Spring 应用:Spring 默认的 Bean 作用域是 singleton。
  • 示例代码
@Service
public class UserService {// 单例模式管理
}

3. 原型模式(Prototype Pattern)

  • 使用场景:每次请求都创建新实例(如用户会话对象)。
  • Spring 应用:通过 @Scope(“prototype”) 定义原型 Bean。
  • 示例代码
@Service
@Scope("prototype")
public class SessionService {// 每次调用都会创建新实例
}

4. 代理模式(Proxy Pattern)

  • 使用场景:无侵入增强对象功能(如日志、事务、安全)。
  • Spring 应用:Spring AOP 底层使用 JDK 动态代理(基于接口)或 CGLIB 代理(基于子类)。
  • 示例代码
@Aspect
@Component
public class LoggingAspect {@Before("execution(* com.example.service.*.*(..))")public void logMethodCall(JoinPoint jp) {System.out.println("调用方法: " + jp.getSignature().getName());}
}

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

  • 使用场景:定义算法骨架,允许子类实现细节。
  • Spring 应用:JdbcTemplate、JmsTemplate 等模板类。
  • 示例代码
public abstract class JdbcTemplate {public final Object execute(String sql) {Connection conn = getConnection(); // 抽象方法Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);Object result = mapResult(rs); // 抽象方法releaseResources(conn, stmt, rs);return result;}protected abstract Connection getConnection();protected abstract Object mapResult(ResultSet rs);
}

6. 策略模式(Strategy Pattern)

  • 使用场景:根据不同场景选择不同实现类(如加载资源)。
  • Spring 应用:Resource 接口(ClassPathResource、FileSystemResource)。
  • 示例代码
Resource resource = new ClassPathResource("config.properties"); // 从类路径加载
Resource resource = new FileSystemResource("/path/to/file.txt"); // 从文件系统加载

7. 适配器模式(Adapter Pattern)

  • 使用场景:兼容不同接口或实现(如不同处理器)。
  • Spring 应用:Spring MVC 中的 HandlerAdapter,处理不同类型的控制器。
  • 示例代码

public class UserController {("/user")public String getUser() {return "user";}
}// Spring MVC 内部使用 HandlerAdapter 调用方法

8. 装饰器模式(Decorator Pattern)

  • 使用场景:动态添加功能(如缓存、安全)。
  • Spring 应用:DataSource 的包装、InputStream 的装饰。
  • 示例代码
DataSource dataSource = new DriverManagerDataSource(); // 基础数据源
dataSource = new TransactionAwareDataSourceProxy(dataSource); // 装饰为支持事务的数据源

9. 观察者模式(Observer Pattern)

  • 使用场景:事件发布与监听(如用户注册后发送邮件)。
  • Spring 应用:ApplicationEvent、ApplicationListener。
  • 示例代码

public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> {public void onApplicationEvent(UserRegisteredEvent event) {System.out.println("发送欢迎邮件给用户:" + event.getUsername());}
}// 发布事件
applicationEventPublisher.publishEvent(new UserRegisteredEvent("张三"));

10. 委派模式(Delegate Pattern)

  • 使用场景:任务分发给其他对象处理。
  • Spring 应用:DispatcherServlet 委托给 HandlerMapping、ViewResolver 等组件处理请求。
  • 示例流程
    DispatcherServlet → HandlerMapping → Controller → ViewResolver → 返回视图

11. 外观模式(Facade Pattern)

  • 使用场景:提供统一接口,简化复杂系统调用。
  • Spring 应用:ApplicationContext 作为统一接口,简化 Bean 管理。
  • 示例代码
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);

12. 工厂方法模式(Factory Method Pattern)

  • 使用场景:定义创建对象的接口,由子类决定具体实现。
  • Spring 应用:BeanFactory 的 getBean() 方法。
  • 示例代码
public interface BeanFactory {Object getBean(String name);
}public class DefaultListableBeanFactory implements BeanFactory {public Object getBean(String name) {// 实际创建 Bean 的逻辑}
}

📌 三、Spring 设计模式使用场景总结

在这里插入图片描述

🧪 四、常见面试题及答案

1. Spring 中使用了哪些设计模式?

答案

  • 工厂模式、单例模式、代理模式、模板方法模式、策略模式、观察者模式、适配器模式、装饰器模式、原型模式、委派模式、外观模式等。

2. Spring AOP 使用了什么设计模式?

答案:代理模式。

  • 基于接口:使用 JDK 动态代理。
  • 基于类:使用 CGLIB 代理。

3. Spring 是如何实现单例的?

答案

  • Spring 容器默认将 Bean 注册为单例。
  • BeanFactory 或 ApplicationContext 在启动时创建 Bean 实例,并缓存供后续使用。

4. 模板方法模式在 Spring 中的应用?

答案:

  • JdbcTemplate 是典型的模板方法模式应用。
  • 提供通用流程(获取连接、执行 SQL、释放资源),子类只需实现 mapRow() 等钩子方法。

5. 策略模式在 Spring 中的应用?

答案:

  • Resource 接口(ClassPathResource、FileSystemResource)。
  • TaskScheduler 接口(不同调度策略)。

6. 观察者模式在 Spring 中的应用?

答案

  • ApplicationEvent 和 ApplicationListener 是典型的观察者模式应用。
  • 例如:用户注册后发布事件,多个监听器处理(发送邮件、记录日志)。

7. 装饰器模式在 Spring 中的应用?

答案

  • DataSource 的装饰(如 TransactionAwareDataSourceProxy)。
  • InputStream 的装饰(如 BufferedInputStream)。

🧩 五、Spring 中设计模式的典型应用场景总结

在这里插入图片描述

📦 六、设计模式对 Spring 架构的意义

在这里插入图片描述

📚 七、推荐学习资料

  • 《Spring 实战》(Craig Walls)
  • 《Spring 设计思想》(Java 架构师必读)
  • Spring 官方文档:https://docs.spring.io/spring-framework/docs/current/javadoc-api/
  • 设计模式经典书籍:《设计模式:可复用面向对象软件的基础》(GoF)

✅ 八、总结:Spring 中设计模式的核心作用

在这里插入图片描述

📄 九、完整代码示例(Spring 中使用设计模式)

1. 工厂模式:BeanFactory 和 ApplicationContext

public interface BeanFactory {Object getBean(String name);
}public class DefaultListableBeanFactory implements BeanFactory {public Object getBean(String name) {// 实际创建 Bean 的逻辑}
}

2. 代理模式:Spring AOP



public class LoggingAspect {("execution(* com.example.service.*.*(..))")public void logMethodCall(JoinPoint jp) {System.out.println("调用方法: " + jp.getSignature().getName());}}

3. 模板方法模式:JdbcTemplate

public abstract class JdbcTemplate {public final Object execute(String sql) {Connection conn = getConnection();Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);Object result = mapResult(rs);releaseResources(conn, stmt, rs);return result;}protected abstract Connection getConnection();protected abstract Object mapResult(ResultSet rs);
}

4. 策略模式:Resource 接口

Resource resource = new ClassPathResource("config.properties"); // 从类路径加载
Resource resource = new FileSystemResource("/path/to/file.txt"); // 从文件系统加载

5. 观察者模式:ApplicationEvent 和 ApplicationListener


public class UserRegisteredListener implements ApplicationListener<UserRegisteredEvent> {public void onApplicationEvent(UserRegisteredEvent event) {System.out.println("发送欢迎邮件给用户:" + event.getUsername());}
}// 发布事件
applicationEventPublisher.publishEvent(new UserRegisteredEvent("张三"));

📌 十、Spring 设计模式应用总结表

在这里插入图片描述


文章转载自:

http://rNcWEQ3u.kjmws.cn
http://NbcryAq9.kjmws.cn
http://4AeFFnGW.kjmws.cn
http://Ft4tMn4r.kjmws.cn
http://vpFyghSj.kjmws.cn
http://13jpMobR.kjmws.cn
http://UEJg2DZh.kjmws.cn
http://oLdipqZH.kjmws.cn
http://KlwOlRsx.kjmws.cn
http://Yv8oSXQo.kjmws.cn
http://kz5fAKLX.kjmws.cn
http://naUOrFRx.kjmws.cn
http://dcRaYpRO.kjmws.cn
http://Lab3VTEf.kjmws.cn
http://MRKAPbd7.kjmws.cn
http://6aXiNjaJ.kjmws.cn
http://MXZAcL2u.kjmws.cn
http://nb5LPzkm.kjmws.cn
http://dr3gPdPu.kjmws.cn
http://L9mDebrX.kjmws.cn
http://BBw8FDnJ.kjmws.cn
http://gOSikXOB.kjmws.cn
http://b3ryYfSH.kjmws.cn
http://9d5UFnIo.kjmws.cn
http://9dJTI9RA.kjmws.cn
http://Wxc020Ey.kjmws.cn
http://meUU60xA.kjmws.cn
http://hFNgs9fI.kjmws.cn
http://YAfBk26g.kjmws.cn
http://5KGbfRdm.kjmws.cn
http://www.dtcms.com/a/373478.html

相关文章:

  • C++ 设计模式《外卖菜单展示》
  • sv语言中压缩数组和非压缩数组
  • C++----验证派生类虚函数表的组成
  • moxa uport1150串口驱动ubantu20.04 5.15内核安装
  • 中州养老项目:登录功能项目鉴权
  • 2025年渗透测试面试题总结-58(题目+回答)
  • [Dify实战]插件编写- 如何让插件直接输出文件对象(支持 TXT、Excel 等)
  • StringBuilder类的数据结构和扩容方式解读
  • SQL 层面行转列
  • XR数字融合工作站赋能新能源汽车专业建设的创新路径
  • 大模型(LLM)安全保障机制(技术、标准、管理)
  • 【LeetCode】String相关算法练习
  • Redis基本数据类型
  • 深度学习(三):监督学习与无监督学习
  • crew AI笔记[5] - knowledge和memory特性详解
  • MyBatis多数据库支持:独立 XML 方案与单文件兼容方案的优劣势分析及选型建议
  • 安卓玩机工具----安卓“搞机工具箱”最新版 控制手机的玩机工具
  • 100、23种设计模式之适配器模式(9/23)
  • Docker网络模式解析
  • ARM处理器基础
  • TDengine 选择函数 First 用户手册
  • 9.8网编基础知识day1
  • 卷积神经网络(CNN):从图像识别原理到实战应用的深度解析
  • 【LeetCode - 每日1题】将整数转换为两个无零整数的和
  • 【超详细图文教程】2025年最新 Jmeter 详细安装教程及接口测试示例
  • MongoDB 常见错误解决方案:从连接失败到主从同步问题
  • Guava中常用的工具类
  • Entity Digital Sports 降低成本并快速扩展
  • 计算机毕业设计选题:基于Spark+Hadoop的健康饮食营养数据分析系统【源码+文档+调试】
  • Rust异步运行时最小实现 - extreme 分享