一、模板方法模式:流程复用的典范
模板方法模式是Spring框架中最基础的设计模式之一,其核心思想在于定义算法骨架,将可变步骤延迟到子类实现。这种模式在JdbcTemplate、RestTemplate等组件中得到了充分应用。
1.1 典型实现分析
以JdbcTemplate为例,其抽象类结构如下:
public abstract class JdbcTemplate {// 模板方法定义完整执行流程public final Object execute(String sql) {Connection conn = null;try {conn = getConnection(); // 钩子方法1Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);return mapResult(rs); // 钩子方法2} finally {releaseResources(conn); // 资源清理}}// 钩子方法交由子类实现protected abstract Connection getConnection();protected abstract Object mapResult(ResultSet rs);}
这种设计实现了三个关键优势:
- 流程复用:连接获取、异常处理、资源释放等通用逻辑在父类中统一实现
- 差异隔离:数据库连接方式、结果映射等业务相关逻辑通过抽象方法暴露
- 扩展便捷:新增数据源支持只需创建子类实现两个抽象方法
1.2 实际应用场景
在微服务开发中,当需要同时支持MySQL和PostgreSQL时,开发者只需创建两个子类:
public class MySQLJdbcTemplate extends JdbcTemplate {@Overrideprotected Connection getConnection() {return DriverManager.getConnection("jdbc:mysql://...");}@Overrideprotected Object mapResult(ResultSet rs) {// MySQL特有结果映射逻辑}}
这种模式在Spring Batch、Spring Integration等模块中也有广泛应用,建议开发者在遇到重复流程时优先考虑模板方法模式。
二、工厂模式:对象创建的解耦艺术
工厂模式在Spring中体现为BeanFactory和ApplicationContext两大核心接口,实现了对象创建与使用的彻底解耦。
2.1 核心接口解析
BeanFactory接口定义了最基础的依赖注入能力:
public interface BeanFactory {Object getBean(String name);<T> T getBean(Class<T> requiredType);boolean containsBean(String name);}
实际应用中,DefaultListableBeanFactory通过三级缓存解决了循环依赖问题:
- 单例对象缓存(singletonObjects)
- 早期曝光对象缓存(earlySingletonObjects)
- 对象工厂缓存(singletonFactories)
2.2 设计优势体现
这种设计实现了三个层次的解耦:
- 使用方解耦:业务代码通过@Autowired注入依赖,无需关心对象创建细节
- 实现方解耦:不同Bean可通过@Scope注解定义生命周期(单例/原型/请求作用域)
- 配置方解耦:支持XML、Java Config、注解等多种配置方式
典型应用场景包括:
- 动态切换数据源实现
- 插件化架构设计
- A/B测试环境配置
三、代理模式:AOP的核心支撑
代理模式在Spring中主要通过JDK动态代理和CGLIB实现,是AOP功能的基础。
3.1 实现机制对比
| 实现方式 | 原理 | 限制条件 |
|---|---|---|
| JDK动态代理 | 基于接口的InvocationHandler | 必须实现接口 |
| CGLIB代理 | 生成子类覆盖方法 | 不能代理final类/方法 |
3.2 典型应用场景
- 事务管理:
@Transactionalpublic class UserService {public void updateUser(User user) {// 业务逻辑}}
- 缓存增强:
@Cacheable("users")public User getUserById(Long id) {// 数据库查询}
- 安全控制:
@PreAuthorize("hasRole('ADMIN')")public void deleteUser(Long id) {// 删除操作}
四、其他重要模式解析
4.1 观察者模式:事件驱动的核心
Spring通过ApplicationEvent和ApplicationListener实现了松耦合的事件通知机制:
// 自定义事件public class OrderCreatedEvent extends ApplicationEvent {public OrderCreatedEvent(Order order) {super(order);}}// 事件监听器@Componentpublic class OrderNotificationListener {@EventListenerpublic void handleOrderCreated(OrderCreatedEvent event) {// 发送通知逻辑}}
4.2 适配器模式:接口兼容的桥梁
HandlerAdapter体系是适配器模式的典型应用,将不同风格的控制器处理逻辑统一为ModelAndView返回:
public interface HandlerAdapter {boolean supports(Object handler);ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object handler);}
4.3 装饰器模式:功能扩展的优雅方案
BufferedInputStream、RequestBodyAdvice等实现都采用了装饰器模式,在不修改原有类的情况下扩展功能。
4.4 责任链模式:过滤器链的实现基础
Servlet规范中的Filter链和Spring Security的过滤器链都是责任链模式的典型应用:
public interface Filter {void doFilter(ServletRequest request,ServletResponse response,FilterChain chain);}
4.5 策略模式:算法选择的灵活性
ResourceLoader接口的实现类(如ClassPathResourceLoader、UrlResourceLoader)体现了策略模式,允许运行时切换资源加载策略。
4.6 享元模式:资源复用的优化
Spring对Bean实例的管理本质上采用了享元模式,特别是单例Bean的共享机制。
五、设计模式选择原则
在实际开发中,选择合适的设计模式需要遵循以下原则:
- 开闭原则:对扩展开放,对修改关闭
- 单一职责:每个类只负责一个功能点
- 里氏替换:子类必须能替换父类
- 依赖倒置:依赖抽象而非具体实现
建议开发者在遇到以下场景时考虑使用对应模式:
- 重复流程:模板方法模式
- 对象创建:工厂模式
- 功能增强:代理模式
- 事件通知:观察者模式
- 接口兼容:适配器模式
通过系统掌握这些设计模式,开发者不仅能更深入地理解Spring框架,还能在自定义组件开发中运用这些经典模式,提升代码质量和可维护性。在实际项目中,建议结合具体业务场景进行模式选择,避免过度设计。