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框架的灵活性和可扩展性,也为开发者提供了丰富的功能和便捷的编程方式。

相关推荐
腥臭腐朽的日子熠熠生辉22 分钟前
解决maven失效问题(现象:maven中只有jdk的工具包,没有springboot的包)
java·spring boot·maven
ejinxian24 分钟前
Spring AI Alibaba 快速开发生成式 Java AI 应用
java·人工智能·spring
杉之29 分钟前
SpringBlade 数据库字段的自动填充
java·笔记·学习·spring·tomcat
圈圈编码1 小时前
Spring Task 定时任务
java·前端·spring
俏布斯1 小时前
算法日常记录
java·算法·leetcode
27669582921 小时前
美团民宿 mtgsig 小程序 mtgsig1.2 分析
java·python·小程序·美团·mtgsig·mtgsig1.2·美团民宿
爱的叹息1 小时前
Java 连接 Redis 的驱动(Jedis、Lettuce、Redisson、Spring Data Redis)分类及对比
java·redis·spring
程序猿chen1 小时前
《JVM考古现场(十五):熵火燎原——从量子递归到热寂晶壁的代码涅槃》
java·jvm·git·后端·java-ee·区块链·量子计算
松韬2 小时前
Spring + Redisson:从 0 到 1 搭建高可用分布式缓存系统
java·redis·分布式·spring·缓存
绝顶少年2 小时前
Spring Boot 注解:深度解析与应用场景
java·spring boot·后端