核心设计模式

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)。

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

7. 策略模式

  • 模式作用:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。策略模式让算法独立于使用它的客户而变化。
  • 在 Spring 中的应用
    • 资源访问Resource 接口是策略接口,其不同实现类(UrlResource, ClassPathResource, FileSystemResource)就是不同的策略。应用程序根据资源路径的前缀(如 classpath:, file:)来选择不同的策略。
    • Spring MVC 视图解析ViewResolver 是策略接口,不同的实现(InternalResourceViewResolver, XmlViewResolver, JsonViewResolver)提供了不同的视图解析策略。

8. 装饰器模式

  • 模式作用:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
  • 在 Spring 中的应用
    • Spring Web 中的 HttpServletRequest 包装: 在 Filter 中,你经常会看到 HttpServletRequestWrapperHttpServletResponseWrapper,它们就是装饰器。你可以通过继承它们来增强请求或响应的功能(例如:对请求参数进行过滤、对响应内容进行压缩),而不需要修改原始的 Servlet Request/Response 对象。

9. 责任链模式

  • 模式作用:将请求的发送者和接收者解耦,使多个对象都有机会处理这个请求,将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
  • 在 Spring 中的应用
    • Spring Security 的过滤器链: 一个安全请求需要经过一系列过滤器(Filter)的处理,如 UsernamePasswordAuthenticationFilter, BasicAuthenticationFilter, ExceptionTranslationFilter 等,这些过滤器形成了一个责任链。
    • Spring MVC 的 HandlerInterceptor: 拦截器链也是一个责任链,请求会依次经过预处理、执行 Controller、后处理等环节。

总结表格

设计模式 在 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 的工作原理至关重要。