设计模式在 Spring 框架中广泛应用,帮助开发者以松耦合、高内聚的方式构建灵活且可维护的应用程序。以下是 Spring 中常见设计模式及其典型应用场景的详细介绍:
1. 工厂模式(Factory Pattern)
- 核心作用:解耦对象的创建与使用。
- Spring 中的实现:
BeanFactory
与ApplicationContext
:Spring 的核心容器本身就是工厂模式的实现。BeanFactory
负责创建和管理 Bean 对象,开发者无需手动new
对象,而是通过容器获取。FactoryBean
接口:允许自定义复杂对象的创建逻辑(如 MyBatis 的SqlSessionFactoryBean
)。
- 示例:
ApplicationContext.getBean("beanName")
通过工厂获取 Bean。
2. 单例模式(Singleton Pattern)
- 核心作用:确保一个类只有一个实例,并提供全局访问点。
- Spring 中的实现:
- 默认 Bean 作用域:Spring 默认将所有 Bean 配置为单例(通过
@Scope("singleton")
),由容器管理生命周期。 - 与传统单例的区别:Spring 的单例是容器级的(每个容器一个实例),而非 ClassLoader 级别的。
- 默认 Bean 作用域:Spring 默认将所有 Bean 配置为单例(通过
- 示例:Service 层和 DAO 层的 Bean 通常设计为单例。
3. 代理模式(Proxy Pattern)
- 核心作用:通过代理对象控制对真实对象的访问。
- Spring 中的实现:
- AOP(面向切面编程):基于动态代理(JDK 动态代理或 CGLIB)实现日志、事务、安全等横切关注点。
@Transactional
注解:通过代理在方法前后添加事务管理逻辑。
- 示例:声明式事务管理通过代理拦截目标方法。
4. 模板方法模式(Template Method Pattern)
- 核心作用:定义算法骨架,将步骤延迟到子类实现。
- Spring 中的实现:
JdbcTemplate
、RestTemplate
:封装数据库操作或 REST 调用的通用流程(如连接获取、异常处理),用户只需实现回调接口(如RowMapper
)。
- 示例:
JdbcTemplate.query()
方法处理 SQL 执行,用户仅需提供 SQL 和结果映射逻辑。
5. 观察者模式(Observer Pattern)
- 核心作用:定义对象间的一对多依赖,当一个对象状态变化时通知所有依赖者。
- Spring 中的实现:
- 事件驱动模型:通过
ApplicationEvent
(事件)、ApplicationListener
(监听器)、ApplicationEventPublisher
(发布者)实现。 - 内置事件:如
ContextRefreshedEvent
(容器刷新完成)、RequestHandledEvent
(HTTP 请求处理完成)。
- 事件驱动模型:通过
- 示例:自定义事件
MyEvent
,通过publishEvent()
发布,由@EventListener
监听处理。
6. 适配器模式(Adapter Pattern)
- 核心作用:将一个接口转换为另一个客户端期望的接口。
- Spring 中的实现:
- Spring MVC 的
HandlerAdapter
:适配不同类型的 Controller(如@Controller
、HttpRequestHandler
),统一调用handleRequest()
方法。 RequestMappingHandlerAdapter
:处理@RequestMapping
注解的方法。
- Spring MVC 的
- 示例:DispatcherServlet 通过
HandlerAdapter
调用不同 Controller 的方法。
7. 装饰者模式(Decorator Pattern)
- 核心作用:动态地为对象添加额外功能。
- Spring 中的实现:
- Bean 的包装类:如
BeanDefinitionDecorator
对 Bean 定义进行装饰。 HttpServletRequest
的包装类:例如ContentCachingRequestWrapper
。
- Bean 的包装类:如
- 示例:通过
BeanPostProcessor
对 Bean 进行增强(如添加日志)。
8. 策略模式(Strategy Pattern)
- 核心作用:定义算法族,使其可互相替换。
- Spring 中的实现:
- 资源加载:
Resource
接口的不同实现策略(如ClassPathResource
、UrlResource
)。 - 事务管理:
PlatformTransactionManager
的不同实现(如 JDBC、JTA、Hibernate 事务管理器)。
- 资源加载:
- 示例:根据配置文件选择不同的事务管理策略。
9. 原型模式(Prototype Pattern)
- 核心作用:通过复制现有对象创建新对象。
- Spring 中的实现:
- Bean 作用域
prototype
:每次请求 Bean 时返回新实例(通过@Scope("prototype")
配置)。
- Bean 作用域
- 示例:需要多实例的 Bean(如用户会话对象)。
10. 责任链模式(Chain of Responsibility Pattern)
- 核心作用:将请求沿处理链传递,直到被某个处理器处理。
- Spring 中的实现:
- 拦截器链(Interceptor Chain):如 Spring MVC 的
HandlerInterceptor
,多个拦截器按顺序处理请求。 - 过滤器链(Filter Chain):在 Servlet 容器中处理 HTTP 请求。
- 拦截器链(Interceptor Chain):如 Spring MVC 的
- 示例:用户认证、日志记录等拦截器依次处理请求。
11. 依赖注入(Dependency Injection, DI)
- 核心作用:解耦对象间的依赖关系,由容器注入依赖。
- Spring 中的实现:
- 构造器注入:通过
@Autowired
或 XML 配置。 - Setter 注入:通过
@Autowired
注解 Setter 方法。
- 构造器注入:通过
- 示例:Service 层依赖 DAO 层对象,由 Spring 自动注入。
总结
Spring 框架通过灵活运用设计模式,实现了高度模块化、可扩展和低耦合的架构。理解这些模式在 Spring 中的应用场景,不仅有助于更高效地使用框架,还能提升代码设计能力。例如:
- AOP 代理解决横切关注点,
- 模板方法简化重复代码,
- 依赖注入实现松耦合,
- 观察者模式支持事件驱动编程。
这些模式共同支撑了 Spring 的核心功能(IoC、AOP、MVC 等),使其成为企业级开发的首选框架。