GOF设计模式在 Spring 框架中的核心应用分析
一、设计模式应用
1. 创建型模式
1.1 工厂方法模式(Factory Method)
- 应用场景:Bean的创建与管理。
- 实现方式:
BeanFactory
:通过getBean()
方法动态创建对象,根据配置或注解决定实例化哪个类。ApplicationContext
:继承自BeanFactory
,提供更高级的工厂功能(如国际化、事件发布)。
- 示例:
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyService service = context.getBean(MyService.class);
1.2 单例模式(Singleton)
- 应用场景:默认Bean作用域,确保全局唯一实例。
- 实现方式:
- 通过
@Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
或 XML配置<bean scope="singleton">
。 - 与GOF单例的区别:Spring通过容器管理单例,而非类自身控制(如静态实例)。
- 通过
- 示例:
@Bean @Scope("singleton") public DataSource dataSource() { return new HikariDataSource(); }
2. 结构型模式
2.1 代理模式(Proxy)
- 应用场景:AOP实现方法增强(日志、事务等)。
- 实现方式:
- JDK动态代理:基于接口代理(如
JdkDynamicAopProxy
)。 - CGLib字节码生成:基于类继承代理(无接口时使用)。
- JDK动态代理:基于接口代理(如
- 示例:
@Aspect public class LogAspect { @Before("execution(* com.xiaolingting.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Method called: " + joinPoint.getSignature()); } }
2.2 适配器模式(Adapter)
- 应用场景:将不同类型的Advice(如
MethodBeforeAdvice
)适配为统一的MethodInterceptor
。 - 实现方式:
AdvisorAdapter
:将Advice
适配为拦截器链中的MethodInterceptor
。
- 示例:
public class MethodBeforeAdviceAdapter implements AdvisorAdapter { public boolean supportsAdvice(Advice advice) { return advice instanceof MethodBeforeAdvice; } public MethodInterceptor getInterceptor(Advisor advisor) { return new MethodBeforeAdviceInterceptor((MethodBeforeAdvice) advisor.getAdvice()); } }
2.3 装饰器模式(Decorator)
- 应用场景:动态增强对象功能(如Session管理、请求包装)。
- 实现方式:
BeanWrapper
:包装Bean实例,提供属性访问和类型转换。SessionRepositoryRequestWrapper
:增强HttpServletRequest的功能(同步分布式Session)。
- 示例:
public class EnhancedRequest extends HttpServletRequestWrapper { public EnhancedRequest(HttpServletRequest request) { super(request); } @Override public String getParameter(String name) { // 对参数进行额外处理 return super.getParameter(name).toUpperCase(); } }
3. 行为型模式
3.1 模板方法模式(Template Method)
- 应用场景:封装算法骨架(如数据库操作、事务管理)。
- 实现方式:
JdbcTemplate
:定义execute()
方法骨架,子类实现具体步骤(如连接获取、异常处理)。
- 示例:
public class UserDao extends JdbcDaoSupport { public List<User> findAll() { return getJdbcTemplate().query("SELECT * FROM users", (rs, rowNum) -> { User user = new User(); user.setId(rs.getLong("id")); user.setName(rs.getString("name")); return user; }); } }
3.2 观察者模式(Observer)
- 应用场景:事件驱动机制(如应用启动事件、自定义业务事件)。
- 实现方式:
ApplicationEvent
与ApplicationListener
:定义事件发布与监听。
- 示例:
// 自定义事件 public class OrderCreatedEvent extends ApplicationEvent { public OrderCreatedEvent(Order order) { super(order); } } // 事件监听 @Component public class OrderEventListener implements ApplicationListener<OrderCreatedEvent> { @Override public void onApplicationEvent(OrderCreatedEvent event) { System.out.println("订单已创建:" + event.getSource()); } }
3.3 策略模式(Strategy)
- 应用场景:根据不同条件选择算法(如Bean实例化策略)。
- 实现方式:
InstantiationStrategy
:定义实例化Bean的不同策略(反射、CGLib等)。
- 示例:
public class CglibSubclassingInstantiationStrategy extends SimpleInstantiationStrategy { @Override public Object instantiate(RootBeanDefinition bd, String beanName, BeanFactory owner) { // 使用CGLib生成子类代理 return Enhancer.create(bd.getBeanClass(), new BeanMethodInterceptor()); } }
3.4 责任链模式(Chain of Responsibility)
- 应用场景:AOP拦截器链、MVC请求处理链。
- 实现方式:
MethodInterceptor
链:多个拦截器按顺序执行,每个拦截器决定是否传递到下一环节。
- 示例:
public class TransactionInterceptor implements MethodInterceptor { public Object invoke(MethodInvocation invocation) throws Throwable { Connection conn = getConnection(); try { conn.setAutoCommit(false); Object result = invocation.proceed(); // 传递到下一个拦截器 conn.commit(); return result; } catch (Exception e) { conn.rollback(); throw e; } } }
二、 总结对比
设计模式 | Spring中的实现 | 核心作用 |
---|---|---|
工厂方法 | BeanFactory , ApplicationContext | 解耦对象创建与使用 |
单例 | Bean作用域配置 | 资源复用与状态共享 |
代理 | AOP动态代理 | 无侵入式功能增强 |
适配器 | AdvisorAdapter | 统一不同接口的调用方式 |
模板方法 | JdbcTemplate | 封装通用流程,扩展细节 |
观察者 | ApplicationEvent /Listener | 松耦合的事件驱动机制 |
策略 | InstantiationStrategy | 动态切换算法实现 |
结论:Spring框架通过 灵活组合GOF设计模式,实现了高扩展性、低耦合的企业级开发框架。理解这些模式的应用场景,有助于掌握Spring的设计精髓,并在实际开发中借鉴其思想。