Spring用了哪些设计模式?

1. 工厂模式(Factory Pattern)

意义:工厂模式是一种常用的对象创建型模式,用于创建对象时不会对客户端暴露创建逻辑,而是通过一个共同的接口来指向新创建的对象。

在Spring中的应用:Spring通过BeanFactory和ApplicationContext等接口实现了工厂模式。BeanFactory作为最基础的容器,提供了getBean()方法来获取Bean实例。ApplicationContext作为BeanFactory的子接口,扩展了BeanFactory的功能,提供了更多配置和服务支持。这种方式将对象的创建与使用解耦,使得程序更加灵活和可扩展。

2. 单例模式(Singleton Pattern)

意义:单例模式确保一个类仅有一个实例,并提供一个全局访问点。在内存中只会创建且只创建一次对象,以防止频繁的创建对象导致内存飙升。

在Spring中的应用:Spring中的Bean默认都是单例的(通过scope="singleton"设置)。这意味着在Spring IoC容器中,每个Bean只会有一个实例。这种方式可以减少内存占用,并提高应用性能。

3. 代理模式(Proxy Pattern)

意义:代理模式为其他对象提供一种代理以控制对这个对象的访问。在Spring中,这主要用于AOP(面向切面编程)功能,通过代理对象在目标方法执行前后添加额外的行为(如日志、事务管理等)。

在Spring中的应用:Spring提供了两种代理方式:JDK动态代理和CGLIB代理。这两种方式都允许开发者在不修改目标类代码的情况下,为目标类添加额外的功能。

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

意义:模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,重新定义算法的某些特定步骤。

在Spring中的应用:Spring的JdbcTemplate、HibernateTemplate等类使用了模板方法模式。这些类定义了对数据库操作的算法骨架,而将一些具体的步骤(如SQL语句的编写)延迟到子类中实现。这种方式简化了数据库操作,并提高了代码的可重用性。

5. 观察者模式(Observer Pattern)

意义:观察者模式是一种行为型模式,用于建立一种对象与对象之间的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

在Spring中的应用:Spring的事件处理机制就是观察者模式的一个应用。当某个事件发生时,所有注册的观察者都会自动收到通知并作出相应的处理。这种方式使得事件的处理更加解耦和灵活。

6. 策略模式(Strategy Pattern)

意义:策略模式定义了一系列算法,并将每一个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而变化,提高了代码的可拓展性,降低了耦合度。

在Spring中的应用:Spring的TaskScheduler接口就定义了不同的任务调度策略,如同步执行、异步执行等。这些策略可以被不同的TaskExecutor实现所使用,以实现不同的任务调度方式。

7. 适配器模式(Adapter Pattern)

意义:适配器模式将一个类的接口转换成客户端所期待的另一种接口形式,使得原本由于接口不兼容而不能一起工作的类可以一起工作。

在Spring中的应用:Spring的AOP模块中使用了适配器模式。由于不同的对象可能有不同的方法签名,而AOP需要在目标方法执行前后添加额外的行为,因此需要通过适配器来将不同的方法签名统一起来。

8. 装饰器模式(Decorator Pattern)

意义:装饰器模式允许向一个现有的对象添加新的功能,同时又不改变其结构。就增加功能来说,装饰器模式相比生成子类更为灵活。

在Spring中的应用:在Spring中,以Wrapper命名的类如BeanWrapper等,使用了装饰器模式来访问Bean的属性和方法。这种方式可以在不修改Bean本身代码的情况下,为Bean添加额外的功能。

以上设计模式在Spring中的应用,不仅提高了Spring框架的灵活性和可扩展性,也为开发者提供了丰富的功能和便捷的编程方式。

相关推荐
闲人一枚(学习中)7 分钟前
设计模式-创建型-抽象工厂模式
设计模式·抽象工厂模式
不是二师兄的八戒23 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生35 分钟前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰1 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
Gu Gu Study2 小时前
枚举与lambda表达式,枚举实现单例模式为什么是安全的,lambda表达式与函数式接口的小九九~
java·开发语言
Chris _data2 小时前
二叉树oj题解析
java·数据结构
牙牙7052 小时前
Centos7安装Jenkins脚本一键部署
java·servlet·jenkins
paopaokaka_luck2 小时前
[371]基于springboot的高校实习管理系统
java·spring boot·后端
以后不吃煲仔饭2 小时前
Java基础夯实——2.7 线程上下文切换
java·开发语言