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

相关推荐
桦说编程30 分钟前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅2 小时前
Java面向对象入门(类与对象,新手秒懂)
java
静水流深_沧海一粟3 小时前
04 | 别再写几十个参数的构造函数了——建造者模式
设计模式
StarkCoder3 小时前
从UIKit到SwiftUI的迁移感悟:数据驱动的革命
设计模式
初次攀爬者3 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺3 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端
Derek_Smart5 小时前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot
NE_STOP5 小时前
MyBatis-mybatis入门与增删改查
java
孟陬9 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端