当前位置: 首页 > web >正文

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

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

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

1. 工厂模式(Factory Pattern)

  • 应用场景:Bean 的创建过程。

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

  • 示例

BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");MyBean bean = factory.getBean("myBean", MyBean.class);

2. 单例模式(Singleton Pattern)

  • 应用场景:Bean 的作用域(默认)。

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

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

3. 代理模式(Proxy Pattern)

  • 应用场景:AOP(面向切面编程)增强。

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

  • 示例

@Servicepublic class UserService {@Transactionalpublic void saveUser() { /* 业务逻辑 */ }}

4. 装饰器模式(Decorator Pattern)

  • 应用场景BeanPostProcessor接口。

  • 作用:允许在 Bean 初始化前后对其增强(如修改属性、添加功能)。

  • 示例

public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {// 初始化前增强return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) {// 初始化后增强(如创建代理)return bean;}
}

5. 观察者模式(Observer Pattern)

  • 应用场景:事件驱动机制(ApplicationEventApplicationListener)。

  • 作用:当 Bean 生命周期事件(如容器启动、关闭)发生时,通知注册的监听器。

  • 示例

// 发布事件
applicationContext.publishEvent(new MyCustomEvent(this, "data"));
// 监听事件
@Component
public class MyEventListener implements ApplicationListener<MyCustomEvent> {@Overridepublic void onApplicationEvent(MyCustomEvent event) { /* 处理事件 */ }}

6. 策略模式(Strategy Pattern)

  • 应用场景InstantiationStrategy接口。

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

  • 源码实现

    • SimpleInstantiationStrategy:普通实例化。

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

7. 模板方法模式(Template Method Pattern)

  • 应用场景AbstractApplicationContext类的refresh()方法。

  • 作用:定义 Bean 生命周期的骨架流程,子类可重写特定步骤(如加载 BeanDefinition)。

  • 源码示例

public abstract class AbstractApplicationContext implements ApplicationContext {@Overridepublic void refresh() {synchronized (this.startupShutdownMonitor) {prepareRefresh(); // 准备刷新ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 加载BeanDefinitionprepareBeanFactory(beanFactory); // 准备BeanFactory// ... 其他步骤}}
}

8. 适配器模式(Adapter Pattern)

  • 应用场景BeanFactoryPostProcessorBeanPostProcessor的注册。

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

  • 示例

public class ApplicationListenerDetector implements BeanPostProcessor {// 适配不同后置处理器到统一接口
}

9. 责任链模式(Chain of Responsibility Pattern)

  • 应用场景BeanPostProcessor链。

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

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

10. 建造者模式(Builder Pattern)

  • 应用场景BeanDefinition的构建。

  • 作用:使用BeanDefinitionBuilder或 Java 配置(@Configuration+@Bean)逐步构建复杂的BeanDefinition

  • 示例

BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MyBean.class);builder.addPropertyValue("name", "test");BeanDefinition beanDefinition = builder.getBeanDefinition();

总结

Spring Bean 生命周期中设计模式的应用体现了其核心原则:松耦合、高内聚、可扩展。通过这些模式,Spring 实现了:

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

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

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

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

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

http://www.xdnf.cn/news/7367.html

相关文章:

  • 通过vcpkg交叉编译grpc:构建Arm64平台的Docker化开发环境
  • 掌握Git:版本控制与高效协作指南
  • 【C++】哈希的概念与实现
  • 命令行登录 MySQL 报 Segmentation fault 故障解决
  • 代购商城系统可以解决哪些重点难题?
  • 前端 vue + element-ui 框架从 0 - 1 搭建
  • React组件开发流程-03.1
  • go 数据类型转换
  • 5个yyds的.Net商城开源项目
  • [特殊字符] Word2Vec:将词映射到高维空间,它到底能解决什么问题?
  • 【Spring Boot 整合 MongoDB 完整指南】
  • sentinel核心原理-高频问题
  • Android设备 显示充电速度流程
  • 使用 Terraform 创建 Azure Databricks
  • Milvus 从 v2.4.12 升级到 v2.5.11 的实施方案
  • 基于Qt的app开发第九天
  • disryptor和rabbitmq
  • 【notes】VScode 使用总结
  • 数据仓库面试题合集②】ETL 设计与调度策略详解
  • MYSQL故障排查和环境优化
  • kotlin flow的写法
  • 【Pandas】pandas DataFrame pct_change
  • 24、钢铁厂峰谷电价策略优化分析 - /能源管理组件/steel-plant-tou-optimization
  • ngx_http_scgi_module 技术指南
  • Python60日基础学习打卡D30
  • 从技术层⾯来说深度SEO优化的⽅式有哪些?
  • CEF源码历史版本编译避坑指南
  • 基于 Keil 的 STM32 全模块开发
  • Windows系统编译Qt使用的kafka(librdkafka)
  • vue2、vue3项目打包生成txt文件-自动记录打包日期:git版本、当前分支、提交人姓名、提交日期、提交描述等信息 和 前端项目的版本号json文件