Spring中的设计模式
核心设计模式
1. 工厂模式
这是 Spring 框架的基石。
- 模式作用:将对象的创建与使用分离,客户端无需关心对象的创建细节,直接从工厂获取。
- 在 Spring 中的应用:
BeanFactory
: 最基础的工厂,提供了 IoC 容器的基本功能。ApplicationContext
: 是BeanFactory
的更高级实现,除了工厂功能,还集成了更多企业级功能(如事件发布、国际化等)。- 工作原理: 你通过配置文件(XML)或注解(
@Component
,@Service
等)定义“零件”(Bean),Spring 容器(工厂)负责根据你的配置装配和提供这些零件的实例。
2. 单例模式
- 模式作用:确保一个类只有一个实例,并提供一个全局访问点。
- 在 Spring 中的应用:
- 默认的 Bean 作用域: 在 Spring 容器中,默认情况下每个定义的 Bean 都是单例的。也就是说,容器只会创建该 Bean 的一个实例,所有依赖注入的请求都会返回同一个共享的实例。
- 好处: 节省了频繁创建和销毁对象的开销,提高了性能。
- 注意: 因此,开发时需要特别注意单例 Bean 的线程安全问题。
3. 代理模式
这是实现 Spring AOP(面向切面编程)的核心。
- 模式作用:为其他对象提供一个代理或占位符,以控制对这个对象的访问。
- 在 Spring 中的应用:
- Spring AOP: 当你为一个 Bean 定义了切面(Aspect,如事务管理
@Transactional
、日志等),Spring 在运行时并不会直接修改你的原始类,而是会动态地创建一个代理对象(Proxy Object)来包裹原始对象。 - 实现方式:
- JDK 动态代理: 如果目标类实现了接口,默认使用此方式。
- CGLIB 字节码增强: 如果目标类没有实现接口,则使用 CGLIB 生成一个目标类的子类作为代理。
- 当你调用一个被代理的方法时,实际上是代理对象在调用,它负责在执行原始方法前后插入切面逻辑(Advice)。
- Spring AOP: 当你为一个 Bean 定义了切面(Aspect,如事务管理
4. 模板方法模式
- 模式作用:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。
- 在 Spring 中的应用:
JdbcTemplate
,HibernateTemplate
,RestTemplate
(已过时),JmsTemplate
等。- 工作原理: 这些
Template
类封装了所有固定的、样板式的代码(例如:获取连接、创建语句、执行、处理异常、关闭连接等),而将可变的部分(如 SQL 语句、结果集处理RowMapper
)以回调接口的形式暴露给开发者。你只需要关注自己的业务逻辑,无需重复编写资源管理代码。
5. 观察者模式 / 发布-订阅模式
- 模式作用:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 在 Spring 中的应用:
- 事件驱动模型:
ApplicationEvent
: 所有应用事件的父类。ApplicationListener
: 监听器接口,实现该接口可以监听特定事件。ApplicationEventPublisher
: 事件发布接口,ApplicationContext
本身就实现了它。
- 示例: 你可以发布一个
UserRegisteredEvent
,然后有多个监听器分别负责发送欢迎邮件、初始化用户积分、记录日志等。
- 事件驱动模型:
6. 适配器模式
- 模式作用:将一个类的接口转换成客户希望的另外一个接口。使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
- 在 Spring 中的应用:
- Spring MVC 中的
HandlerAdapter
: DispatcherServlet 并不直接处理各种 Controller(如@Controller
,Servlet
,HttpRequestHandler
等),因为它不知道如何调用它们。HandlerAdapter
作为适配器,屏蔽了不同 Controller 的处理细节,让 DispatcherServlet 可以用统一的接口与它们交互。 - Spring AOP 中的
AdvisorAdapter
: 用于将不同类型的 AOP 通知(如 Spring 的MethodBeforeAdvice
)适配成 AOP 联盟标准的MethodInterceptor
。
- Spring MVC 中的
7. 策略模式
- 模式作用:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式让算法独立于使用它的客户而变化。
- 在 Spring 中的应用:
- 资源访问:
Resource
接口是策略接口,其不同实现类(UrlResource
,ClassPathResource
,FileSystemResource
)就是不同的策略。应用程序根据资源路径的前缀(如classpath:
,file:
)来选择不同的策略。 - Spring MVC 视图解析:
ViewResolver
是策略接口,不同的实现(InternalResourceViewResolver
,XmlViewResolver
,JsonViewResolver
)提供了不同的视图解析策略。
- 资源访问:
8. 装饰器模式
- 模式作用:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
- 在 Spring 中的应用:
- Spring Web 中的
HttpServletRequest
包装: 在Filter
中,你经常会看到HttpServletRequestWrapper
和HttpServletResponseWrapper
,它们就是装饰器。你可以通过继承它们来增强请求或响应的功能(例如:对请求参数进行过滤、对响应内容进行压缩),而不需要修改原始的 Servlet Request/Response 对象。
- Spring Web 中的
9. 责任链模式
- 模式作用:将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求,将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
- 在 Spring 中的应用:
- Spring Security 的过滤器链: 一个安全请求需要经过一系列过滤器(
Filter
)的处理,如UsernamePasswordAuthenticationFilter
,BasicAuthenticationFilter
,ExceptionTranslationFilter
等,这些过滤器形成了一个责任链。 - Spring MVC 的
HandlerInterceptor
: 拦截器链也是一个责任链,请求会依次经过预处理、执行 Controller、后处理等环节。
- Spring Security 的过滤器链: 一个安全请求需要经过一系列过滤器(
总结表格
设计模式 | 在 Spring 中的典型应用 | 目的 |
---|---|---|
工厂模式 | BeanFactory , ApplicationContext |
解耦对象的创建与使用,实现控制反转(IoC) |
单例模式 | Bean 的默认作用域 | 保证一个类只有一个实例,节省资源 |
代理模式 | Spring AOP(如 @Transactional ) |
控制对象访问,实现无侵入式的功能增强 |
模板方法 | JdbcTemplate , JmsTemplate 等 |
封装固定流程,暴露可变部分,消除样板代码 |
观察者模式 | ApplicationEvent , ApplicationListener |
实现应用内的事件驱动、解耦业务逻辑 |
适配器模式 | HandlerAdapter (Spring MVC) |
使不兼容的接口能够一起工作 |
策略模式 | Resource 资源访问,ViewResolver |
封装算法,使其可以灵活替换 |
装饰器模式 | HttpServletRequestWrapper |
动态地给对象添加额外功能 |
责任链模式 | Spring Security 过滤器链,HandlerInterceptor |
将处理请求的对象连成一条链,依次处理 |
Spring 框架的伟大之处在于,它并非生硬地套用这些模式,而是将它们有机地融合在一起,共同支撑起了 IoC 和 AOP 这两大核心特性,最终为开发者提供了一个高度可扩展、灵活且强大的企业级应用开发框架。理解这些设计模式,对于深入掌握 Spring 的工作原理至关重要。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 技术之路!
评论