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

Spring是如何实现scope作用域支持

众所周知在Spring的Bean当中是存在两种作用域的,即单例模式与多例模式,可通过scope来指定

下面就是注册一个多例Bean

<bean id="people" class="org.qlspringframework.beans.ioc.bean.People" scope="prototype">  <property name="name" value="derek"/>  
</bean>

那么什么是单例模式什么是多例模式呢?说白了其实就是与是否通过Spring的完整生命周期有关,对于单例模式的Bean,会通过完整的生命周期来创建,同时也会将Bean加入到Spring的缓存当中,再次获取会从缓存当中拿。那么多例模式就不会产生这种情况,每一次通过get()方法获取 Bean的时候都是重新创建。

下面看一下如何实现scope作用域支持

首先Bean的作用域是通过BeanDefinition定义的,那我们就需要在其中定义相关属性,除此之外Bean的默认作用域是单例,也就是说在用户未指定的情况下应保持singleton。

BeanDefinition

public static String SCOPE_SINGLETON = "singleton";  public static String SCOPE_PROTOTYPE = "prototype";  private String scope = SCOPE_SINGLETON;// 单列模式  
private boolean singleton = true;  // 多列模式  
private boolean prototype = false;  public void setScope(String scope){  this.scope = scope;  this.singleton = SCOPE_SINGLETON.equals(scope);  this.prototype = SCOPE_PROTOTYPE.equals(scope);  
}  public boolean isSingleton() {  return this.singleton;  
}  public boolean isPrototype() {  return this.prototype;  
}

之后就是对XML的解析过程

XmlBeanDefinitionReader


```java
String beanScope = bean.attributeValue(SCOPE_ATTRIBUTE);  beanDefinition.setDestroyMethodName(destroyMethodName);  
if (StrUtil.isNotEmpty(beanScope)) {  beanDefinition.setScope(beanScope);  
}

这样我们的基础准备就完毕了,剩下的是对执行Bean生命周期的过程进行修改

首先就是多例Bean在创建完毕后不需要加入缓存

AbstractAutowireCapableBeanFactory

// 创建完毕后加入缓存  
if (beanDefinition.isSingleton()){  super.addSingletonBean(beanName, bean);  
}

其次对于多例Bean不需要提前初始化

DefaultListableBeanFactory

/**  * 提前实例化所有单例Bean。  */  
@Override  
public void preInstantiateSingletons() {  beanDefinitionMap.forEach((key,value) -> {  if (value.isSingleton()){  super.getBean(key);  }  });  
}

相关文章:

  • Mac如何允许安装任何来源软件?
  • 《决策科学与艺术》No1: 决策树:概念、原理、发展历史、特点及应用
  • 使用 OpenCV 实现万花筒效果
  • 跨域_Cross-origin resource sharing
  • 微软押注“代理式AI网络”:一场重塑软件开发与工作方式的技术革命
  • 仓颉开发语言入门教程:常见UI组件介绍和一些问题踩坑
  • Vue 3.0 中 Teleport 详解
  • 基于 ESP32 与 AWS 全托管服务的 IoT 架构:MQTT + WebSocket 实现设备-云-APP 高效互联
  • 打破建筑与制造数据壁垒:Revit 到 STP 格式转换全攻略(含插件应用 + 迪威模型实战)
  • AI 商业化部署中,ollama 和 vllm 的选型对比
  • 用浏览器的--kiosk模式实现网页打开后自动全屏
  • 基于pycharm,python,flask,tensorflow,keras,orm,mysql,在线深度学习sql语句检测系统
  • 通过COM获取正在运行的Excel实例并关闭 c#实现
  • C# Task 与 SynchronizationContext
  • 房贷利率计算前端小程序
  • 剧本杀小程序:指尖上的沉浸式推理宇宙
  • FreeRTOS全攻略:从入门到精通
  • Python异步编程详解
  • ElasticSearch性能优化
  • 自回归图像编辑 EditAR: Unified Conditional Generation with Autoregressive Models
  • 凤阳文旅局回应鼓楼瓦片脱落:鼓楼楼宇系仿古建筑,动工时已履行报批手续
  • 建立双城双向科创项目孵化机制,2025沪港创新项目评选启动
  • 上海国际电影电视节 | 奔赴电影之城,开启光影新程
  • 西安集中整治监督教育领域不正之风和腐败问题,举报方式公布
  • 甘肃白银煤矿透水事故最新进展:3名被困矿工已无生命体征
  • 俄美元首通话超2小时,普京称愿与乌方共同起草和平备忘录