Spring Bean 生命周期中使用的设计模式
Spring Bean 的生命周期涉及多个阶段和扩展点,Spring 框架在这一过程中巧妙运用了多种设计模式,以实现强大的功能和灵活性。以下是主要设计模式及其应用场景:
- 工厂模式(Factory Pattern)
-
应用场景:Bean 的创建过程。
-
作用 :通过
BeanFactory
和ApplicationContext
作为工厂接口,负责实例化、配置和管理 Bean,用户无需手动创建对象。 -
示例:
java
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean bean = factory.getBean("myBean", MyBean.class);
- 单例模式(Singleton Pattern)
-
应用场景:Bean 的作用域(默认)。
-
作用:Spring 默认将 Bean 配置为单例模式,确保一个 BeanDefinition 在 IoC 容器中只存在一个实例。
-
源码实现 :通过
DefaultSingletonBeanRegistry
类的缓存机制管理单例 Bean。
- 代理模式(Proxy Pattern)
-
应用场景:AOP(面向切面编程)增强。
-
作用:当 Bean 需要 AOP 增强时,创建代理对象(JDK 动态代理或 CGLIB 代理),织入切面逻辑(如事务管理、日志记录)。
-
示例:
java
@Service
public class UserService {
@Transactional
public void saveUser() { /* 业务逻辑 */ }
}
- 装饰器模式(Decorator Pattern)
-
应用场景 :
BeanPostProcessor
接口。 -
作用:允许在 Bean 初始化前后对其增强(如修改属性、添加功能)。
-
示例:
java
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
// 初始化前增强
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
// 初始化后增强(如创建代理)
return bean;
}
}
- 观察者模式(Observer Pattern)
-
应用场景 :事件驱动机制(
ApplicationEvent
和ApplicationListener
)。 -
作用:当 Bean 生命周期事件(如容器启动、关闭)发生时,通知注册的监听器。
-
示例:
java
// 发布事件
applicationContext.publishEvent(new MyCustomEvent(this, "data"));
// 监听事件
@Component
public class MyEventListener implements ApplicationListener<MyCustomEvent> {
@Override
public void onApplicationEvent(MyCustomEvent event) { /* 处理事件 */ }
}
- 策略模式(Strategy Pattern)
-
应用场景 :
InstantiationStrategy
接口。 -
作用:决定如何实例化 Bean(如构造器反射、CGLIB 子类化)。
-
源码实现:
-
SimpleInstantiationStrategy
:普通实例化。 -
CglibSubclassingInstantiationStrategy
:支持 AOP 代理的实例化。
-
- 模板方法模式(Template Method Pattern)
-
应用场景 :
AbstractApplicationContext
类的refresh()
方法。 -
作用:定义 Bean 生命周期的骨架流程,子类可重写特定步骤(如加载 BeanDefinition)。
-
源码示例:
java
public abstract class AbstractApplicationContext implements ApplicationContext {
@Override
public void refresh() {
synchronized (this.startupShutdownMonitor) {
prepareRefresh(); // 准备刷新
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 加载BeanDefinition
prepareBeanFactory(beanFactory); // 准备BeanFactory
// ... 其他步骤
}
}
}
- 适配器模式(Adapter Pattern)
-
应用场景 :
BeanFactoryPostProcessor
和BeanPostProcessor
的注册。 -
作用:将不同类型的处理器适配到统一的处理接口中。
-
示例:
java
public class ApplicationListenerDetector implements BeanPostProcessor {
// 适配不同后置处理器到统一接口
}
- 责任链模式(Chain of Responsibility Pattern)
-
应用场景 :
BeanPostProcessor
链。 -
作用 :多个
BeanPostProcessor
按顺序处理 Bean,形成处理链。 -
源码实现 :
AbstractAutowireCapableBeanFactory
中依次调用所有注册的BeanPostProcessor
。
- 建造者模式(Builder Pattern)
-
应用场景 :
BeanDefinition
的构建。 -
作用 :使用
BeanDefinitionBuilder
或 Java 配置(@Configuration
+@Bean
)逐步构建复杂的BeanDefinition
。 -
示例:
java
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyBean.class);
builder.addPropertyValue("name", "test");
BeanDefinition beanDefinition = builder.getBeanDefinition();
总结
Spring Bean 生命周期中设计模式的应用体现了其核心原则:松耦合、高内聚、可扩展。通过这些模式,Spring 实现了:
-
创建与管理:工厂模式、单例模式。
-
功能增强:代理模式、装饰器模式。
-
事件驱动:观察者模式。
-
灵活配置:策略模式、建造者模式。
-
流程标准化:模板方法模式、责任链模式。=