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

bean的作用域_除了Bean名称和类名,还有哪些Bean元信息值得关注?

欢迎关注公众号“码农架构”

高可用、高性能、高并发类技术分享!

f24ef02dafb07abf2f41e415f8605d72.png

Spring 上一篇文章中已介绍了Bean 的定义,什么是BeanDefinition?下面主要源码结合模式分析BeanDefinition元信息

下面罗列了BeanDefinition元信息配置

fcb294d23b8f3634af21bb7357027131.png

上面一表格形式概括说明BeanDefinition元信息配置,不是所有的属性配置都是必须的,但是前面几个参数属性是必须的

附加补充说明

  • Bean 的作用域 (比如:我们常用的singleton、prototype、request等)作用域类型如下图所示,后续会针对Scope做详细讲解
6e017a7c9e1c9a6e9524688e15b54be0.png
  • Bean 的自定绑定模式 (比如:byName、byType、constructor等)自动绑定模式、这种方式属性和外面引用自动关联和配置
6e54183f38703c8d85531634905ae414.png
  • Bean 的延迟初始化的模式,默认情况下是非延迟的,就是Bean在容器启动过程中会实时进行初始化,此时相对应的属性或则配置会进行一定的设置;相反延迟化的,是按需进行初始化,这种方式可以有效减少启动时间,需要的时候对Bean进行初始化
  • Bean 的初始化 & 销毁,通常都是成对出现

如何构建BeanDefinition?

  • 通过 BeanDefinitionBuilder 构建
  • 通过 AbstractBeanDefinition 以及派生类

注意细节⚠️

BeanDefinitionBuilder提供了两种方式获取BeanDefinitionBuilder

// 普通方式获取,非根的Bean,可以有父类BeanDefinitionBuilder#genericBeanDefinition // 根节点获取,只能获取根节点Bean即最顶层BeanBeanDefinitionBuilder#rootBeanDefinition  
d3f7b4c4cec532e38494eb3e6f3991a1.png

实例

public class BeanDefinitionCreationDemo {    public static void main(String[] args) {        // 1.通过BeanDefinitionBuilder 构建        BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(User.class);        // 通过属性配置        beanDefinitionBuilder.addPropertyValue("id", 1);        beanDefinitionBuilder.addPropertyValue("name", "小码哥");        // 获取BeanDefinition 实例        BeanDefinition beanDefinition = beanDefinitionBuilder.getBeanDefinition();        // BeanDefinition 并非 Bean 终态,可以自定义修改        // 2. 通过 AbstractBeanDefinition 以及派生类        GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();        // 设置Bean 类型        genericBeanDefinition.setBeanClass(User.class);        // 通过MutablePropertyValues 批量操作属性        MutablePropertyValues propertyValues = new MutablePropertyValues();        propertyValues                .add("id", 1)                .add("name","小码哥");        // 通过 set MutablePropertyValues 批量操作属性        genericBeanDefinition.setPropertyValues(propertyValues);    }}

BeanDefinitionBuilder#addPropertyValue

/*** Add the supplied property value under the given property name.*/public BeanDefinitionBuilder addPropertyValue(String name, @Nullable Object value) {      this.beanDefinition.getPropertyValues().add(name, value);      return this;}

先前看过源码的朋友会发现这里的细节#addPropertyValue 链式调用方便我们的使用,后续在自己摸源码设计上可以借鉴这种Builder实现

源码地址:https://gitee.com/ibyte/thinking-in-spring

相关文章:

  • imresize函数matlab_如何写出三体的MATLAB程序-代码篇
  • python决策树算法_决策树算法(python)
  • cas无法使用_并发编程中cas的这三大问题你知道吗?
  • python写微信小程序商城_Python(Django 2.x)+Vue+Uniapp微信小程序商城开发视频教程
  • python中如何将两个列表进行合并_Python中如何把两个list合并,并按从小到大顺序排列?...
  • ctf xss利用_从xss挑战之旅来重读xss(一)
  • python考研参考书目_Python自学日记28——如何选择学习资料
  • 无法应用转换程序_电脑硬盘无法安装应用程序怎么办?
  • educoder实训平台python入门之运算符的使用_Python入门教程-运算符
  • docker rabbitmq_docker快速部署rabbitmq多机集群
  • python程序设计学生的自我总结_《Python程序设计》学生答疑【20200227】
  • ssl 接收到一个超出最大准许长度的记录_从零编写一个自己的蜜罐系统
  • pythondocumentation_python官方文档
  • python怎么突然这么火_为什么python突然变得这么火了?
  • gdb 条件断点_蜂鸟E203系列——Linux调试(GDB+Openocd)
  • 「译」Node.js Streams 基础
  • es6(二):字符串的扩展
  • Fastjson的基本使用方法大全
  • Hibernate【inverse和cascade属性】知识要点
  • JavaScript类型识别
  • Laravel核心解读--Facades
  • markdown编辑器简评
  • MySQL的数据类型
  • PaddlePaddle-GitHub的正确打开姿势
  • Tornado学习笔记(1)
  • Twitter赢在开放,三年创造奇迹
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 观察者模式实现非直接耦合
  • 基于web的全景—— Pannellum小试
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 《码出高效》学习笔记与书中错误记录
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • $refs 、$nextTic、动态组件、name的使用
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (31)对象的克隆
  • (Git) gitignore基础使用
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (二)JAVA使用POI操作excel
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (转载)hibernate缓存
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ./configure,make,make install的作用
  • .NET Framework杂记
  • .NET 中让 Task 支持带超时的异步等待
  • ??javascript里的变量问题
  • @html.ActionLink的几种参数格式
  • [android] 切换界面的通用处理
  • [android] 请求码和结果码的作用
  • [C# 网络编程系列]专题六:UDP编程
  • [C]编译和预处理详解
  • [C++基础]-初识模板
  • [Cocoa]iOS 开发者账户,联机调试,发布应用事宜
  • [Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷