Spring Bean 生命周期中设计模式的应用与解析

Spring Bean 生命周期中使用的设计模式

Spring Bean 的生命周期涉及多个阶段和扩展点,Spring 框架在这一过程中巧妙运用了多种设计模式,以实现强大的功能和灵活性。以下是主要设计模式及其应用场景:

  1. 工厂模式(Factory Pattern)
  • 应用场景:Bean 的创建过程。

  • 作用 :通过BeanFactory和ApplicationContext作为工厂接口,负责实例化、配置和管理 Bean,用户无需手动创建对象。

  • 示例:

java 复制代码
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");


MyBean bean = factory.getBean("myBean", MyBean.class);
  1. 单例模式(Singleton Pattern)
  • 应用场景:Bean 的作用域(默认)。

  • 作用:Spring 默认将 Bean 配置为单例模式,确保一个 BeanDefinition 在 IoC 容器中只存在一个实例。

  • 源码实现 :通过DefaultSingletonBeanRegistry类的缓存机制管理单例 Bean。

  1. 代理模式(Proxy Pattern)
  • 应用场景:AOP(面向切面编程)增强。

  • 作用:当 Bean 需要 AOP 增强时,创建代理对象(JDK 动态代理或 CGLIB 代理),织入切面逻辑(如事务管理、日志记录)。

  • 示例:

java 复制代码
@Service


public class UserService {


   @Transactional


   public void saveUser() { /* 业务逻辑 */ }


}
  1. 装饰器模式(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;
   }
}
  1. 观察者模式(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) { /* 处理事件 */ }

}
  1. 策略模式(Strategy Pattern)
  • 应用场景 :InstantiationStrategy接口。

  • 作用:决定如何实例化 Bean(如构造器反射、CGLIB 子类化)。

  • 源码实现:

    • SimpleInstantiationStrategy:普通实例化。

    • CglibSubclassingInstantiationStrategy:支持 AOP 代理的实例化。

  1. 模板方法模式(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
           // ... 其他步骤
       }
   }
}
  1. 适配器模式(Adapter Pattern)
  • 应用场景 :BeanFactoryPostProcessor和BeanPostProcessor的注册。

  • 作用:将不同类型的处理器适配到统一的处理接口中。

  • 示例:

java 复制代码
public class ApplicationListenerDetector implements BeanPostProcessor {
   // 适配不同后置处理器到统一接口
}
  1. 责任链模式(Chain of Responsibility Pattern)
  • 应用场景 :BeanPostProcessor链。

  • 作用 :多个BeanPostProcessor按顺序处理 Bean,形成处理链。

  • 源码实现 :AbstractAutowireCapableBeanFactory中依次调用所有注册的BeanPostProcessor。

  1. 建造者模式(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 实现了:

  • 创建与管理:工厂模式、单例模式。

  • 功能增强:代理模式、装饰器模式。

  • 事件驱动:观察者模式。

  • 灵活配置:策略模式、建造者模式。

  • 流程标准化:模板方法模式、责任链模式。=

相关推荐
木棉软糖7 分钟前
JDBC 读 ResultSet 读到一半,报 stream closed
java·mysql·spring
狂奔的sherry13 分钟前
JRuby 多线程反引号偶发 127:GC 提前释放了 posix_spawn 的 argv
java·linux·ruby·gc·jruby
咖啡八杯15 分钟前
异常体系设计:三类策略(i18n code、message、受检异常)
java·架构·代码规范
Spatial3Ddddd30 分钟前
2026空间三维重建服务商横向对比
java·服务器·人工智能
Rain的Java大神之路1 小时前
Java 三层架构,90% 的人只答对一半:Controller 不是瘦,Service 不是透传,Dao 不是只写 SQL
java·后端·面试
Thomas.Sir1 小时前
第29课:微服务异步调用、线程池优化 & 事件驱动开发
java·redis·微服务
.Hypocritical.1 小时前
【Java 进阶】泛型深度解析|泛型类、泛型方法、通配符、类型擦除、PECS 原则
java·开发语言·泛型
这个DBA有点耶1 小时前
MySQL B-tree索引并发控制优化:写密集场景的锁瓶颈与内核级解法
java·数据库·程序人生·算法·database·dba
RuoyiOffice1 小时前
Spring AI+Vue3 企业知识库设计:让每个答案有依据,让每份资料守住权限
java·spring boot·vue3·rag·企业知识库·spring ai·ruoyi office
倔强的石头1062 小时前
【Linux指南】进程通信系列(二):匿名管道 —— pipe 的本质、fork 继承与四种读写规则
java·linux·运维