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

【Spring】Spring框架中有有哪些常见的设计模式

Spring 框架中广泛运用了多种设计模式,今天让我们来学习一下

1. 单例模式(Singleton Pattern)

  • 用途:在Spring框架中,Bean默认是单例的,也就是说在容器中每种类型的Bean只有一个实例。这个设计可以节省资源,提高性能,因为我们不需要每次都创建新的实例。
  • 实现:当Spring容器启动时,会为每个作用域为singleton的Bean创建一个实例并保存起来。每次需要使用该Bean时,Spring会直接返回这个已存在的实例,避免重复创建。

2. 代理模式(Proxy Pattern)

  • 用途:Spring AOP(面向切面编程)大量使用代理模式来实现功能扩展,比如日志记录、事务管理等。代理对象在目标方法执行前后插入额外的操作。
  • 实现:Spring提供了两种代理方式:如果目标类实现了接口,就用JDK动态代理;如果没有接口,Spring则使用CGLIB动态代理生成目标类的子类。

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

  • 用途:该模式用于定义一个操作的框架,将具体实现交给子类来完成。在Spring中,很多数据库操作和事务管理都用到了模板方法模式。
  • 实现:比如,JdbcTemplate类就使用了模板方法模式,开发者只需关心SQL语句和参数,而Spring负责处理数据库连接、异常捕获和资源释放等细节。

4. 策略模式(Strategy Pattern)

  • 用途:通过将不同的算法封装在独立的类中,使得这些算法可以互换使用,而不影响客户端。Spring使用策略模式来实现各种可替换的算法和逻辑。
  • 实现:例如,在事务管理中,Spring提供了不同的事务策略(如JDBC和JTA);在视图解析中,Spring允许使用多种视图解析策略(如JSP、Thymeleaf等)。

5. 适配器模式(Adapter Pattern)

  • 用途:适配器模式用于将不同的接口进行适配,使得不兼容的接口能够协同工作。Spring的AOP和MVC框架就广泛使用了适配器模式。
  • 实现:在Spring MVC中,HandlerAdapter将不同类型的控制器(如HttpRequestHandlerController)适配为统一的处理接口,从而支持多种控制器类型。

6. 装饰器模式(Decorator Pattern)

  • 用途:装饰器模式允许在不改变对象本身的情况下,动态地为其添加功能。在Spring中,AOP本质上就是一种装饰器模式,它在目标对象上添加额外的行为。
  • 实现:通过代理对象,Spring AOP在目标方法调用前后执行增强操作,例如记录日志、管理事务等。

7. 观察者模式(Observer Pattern)

  • 用途:观察者模式使得组件之间可以实现松耦合的事件通信,Spring的事件机制就使用了这种模式。通过事件发布和订阅,组件之间可以在事件发生时互相通知。
  • 实现ApplicationEventPublisher用于发布事件,ApplicationListener用于监听事件。当事件被发布时,所有订阅了该事件的监听器都会得到通知。

8. 工厂模式(Factory Pattern)

  • 用途:Spring使用工厂模式来管理Bean的创建。通过BeanFactoryApplicationContext等接口,Spring能够将对象的创建与使用分离,从而提高程序的灵活性和可扩展性。
  • 实现BeanFactory是一个接口,提供了获取Bean的方法;而ApplicationContextBeanFactory的扩展,除了提供Bean获取功能外,还提供了事件处理、国际化支持
http://www.lryc.cn/news/482906.html

相关文章:

  • 提升百度排名的有效策略与技巧解析
  • 【Linux】Linux下查看cpu信息指令(top/mpstat/iostat/pidstat)说明
  • HDLBIts习题(3):使用冒号表示位宽时,冒号两端必须是常量
  • C++20协程详解
  • Chromium 中chrome.system.display扩展接口定义c++
  • 容器docker的ulimit
  • 一、HTML
  • 使用Geekbench6软件对真实和虚拟的苹果桌面系统(macOS)进行打分比较
  • lua入门教程:随机数
  • 华为大咖说 | 浅谈智能运维技术
  • creo toolkit二次开发学习之获取任意选择模型作为元件,并进行获取约束等
  • sanitize-html 防止 XSS(跨站脚本攻击)
  • 【JavaEE】文件io
  • FlinkPipelineComposer 详解
  • 蓝桥杯-洛谷刷题-day2(C++)
  • 16008.行为树(五)-自定义数据指针在黑板中的传递
  • javascript Vue
  • 《揭秘观察者模式:作用与使用场景全解析》
  • 【QT常用技术讲解】优化网络链接不上导致qt、qml界面卡顿的问题
  • 下划线命名json数组转java对象
  • 实测运行容器化Nginx服务器
  • 显示器接口种类 | 附图片
  • C++初阶——list
  • 软件设计师-排序算法
  • 即插即用篇 | YOLOv8 引入 代理注意力 AgentAttention
  • 020_Servlet_Mysql学生选课系统(新版)_lwplus87
  • LabVIEW导入并显示CAD DXF文件图形 程序见附件
  • 《云原生安全攻防》-- K8s安全防护思路
  • 鸿蒙系统的发展及开发者机遇
  • Java | Leetcode Java题解之第556题下一个更大元素III