设计模式应用
深入理解Spring框架中应用的设计模式,包括工厂模式、单例模式、代理模式、模板方法模式、策略模式、观察者模式等,通过学习这些模式理解Spring的设计思想。
📋 设计模式概览
Spring框架大量使用了设计模式,这些模式使Spring具有高度的可扩展性和灵活性。
🎯 一、工厂模式
1.1 BeanFactory
BeanFactory是工厂模式的典型应用,用于创建和管理Bean:
java
public interface BeanFactory {
Object getBean(String name) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
}1.2 FactoryBean
FactoryBean允许用户自定义Bean的创建逻辑:
java
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}应用场景:
- MyBatis的SqlSessionFactory
- Hibernate的SessionFactory
- 复杂对象的创建
🎯 二、单例模式
2.1 单例Bean
Spring默认使用单例模式管理Bean,通过singletonObjects缓存单例Bean:
java
private final Map<String, Object> singletonObjects =
new ConcurrentHashMap<>(256);2.2 单例实现
单例Bean在容器中只创建一次,后续获取都返回同一个实例。
🎯 三、代理模式
3.1 AOP代理
Spring AOP使用代理模式实现横切关注点:
- JDK动态代理:基于接口实现
- CGLIB代理:基于类继承实现
3.2 代理应用
- 事务管理
- 日志记录
- 性能监控
- 权限控制
🎯 四、模板方法模式
4.1 AbstractApplicationContext
AbstractApplicationContext.refresh()方法是模板方法模式的典型应用:
java
public void refresh() throws BeansException {
// 1. 准备刷新(模板方法)
prepareRefresh();
// 2. 获取BeanFactory(抽象方法,由子类实现)
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 3. 准备BeanFactory(模板方法)
prepareBeanFactory(beanFactory);
// ... 其他步骤
// 9. 子类扩展点(钩子方法)
onRefresh();
// ... 其他步骤
}4.2 模板方法模式应用
AbstractApplicationContext.refresh()AbstractBeanFactory.getBean()AbstractAutowireCapableBeanFactory.createBean()
🎯 五、策略模式
5.1 BeanPostProcessor
BeanPostProcessor是策略模式的典型应用,不同的处理器实现不同的处理策略:
java
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException;
}5.2 策略模式应用
- 不同的BeanPostProcessor实现不同的处理逻辑
- 不同的TransactionManager实现不同的事务管理策略
- 不同的Converter实现不同的类型转换策略
🎯 六、观察者模式
6.1 事件机制
Spring的事件机制是观察者模式的典型应用:
java
public interface ApplicationEventPublisher {
void publishEvent(ApplicationEvent event);
}
public interface ApplicationListener<E extends ApplicationEvent>
extends EventListener {
void onApplicationEvent(E event);
}6.2 事件应用
- ContextRefreshedEvent:容器刷新事件
- ContextStartedEvent:容器启动事件
- ContextStoppedEvent:容器停止事件
🎯 七、责任链模式
7.1 HandlerInterceptor
Spring MVC的拦截器链是责任链模式的应用:
java
public interface HandlerInterceptor {
boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception;
void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception;
void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex) throws Exception;
}7.2 责任链应用
- 拦截器链
- Filter链
- AOP拦截器链
📖 学习资源
视频教程
书籍推荐
- 《设计模式:可复用面向对象软件的基础》 - GoF
- 《Spring源码深度解析》 - 郝佳
网站资源
✅ 学习检查清单
- [ ] 已理解工厂模式在Spring中的应用
- [ ] 已理解单例模式在Spring中的应用
- [ ] 已理解代理模式在Spring中的应用
- [ ] 已理解模板方法模式在Spring中的应用
- [ ] 已理解策略模式在Spring中的应用
- [ ] 已理解观察者模式在Spring中的应用
- [ ] 已理解责任链模式在Spring中的应用
- [ ] 已总结设计模式应用场景
上一章节:循环依赖处理
返回目录:Spring源码深度解析