bean的作用域_除了Bean名称和类名,还有哪些Bean元信息值得关注?
欢迎关注公众号“码农架构”
高可用、高性能、高并发类技术分享!
Spring 上一篇文章中已介绍了Bean 的定义,什么是BeanDefinition?下面主要源码结合模式分析BeanDefinition元信息
下面罗列了BeanDefinition元信息配置
上面一表格形式概括说明BeanDefinition元信息配置,不是所有的属性配置都是必须的,但是前面几个参数属性是必须的
附加补充说明
- Bean 的作用域 (比如:我们常用的singleton、prototype、request等)作用域类型如下图所示,后续会针对Scope做详细讲解
- Bean 的自定绑定模式 (比如:byName、byType、constructor等)自动绑定模式、这种方式属性和外面引用自动关联和配置
- Bean 的延迟初始化的模式,默认情况下是非延迟的,就是Bean在容器启动过程中会实时进行初始化,此时相对应的属性或则配置会进行一定的设置;相反延迟化的,是按需进行初始化,这种方式可以有效减少启动时间,需要的时候对Bean进行初始化
- Bean 的初始化 & 销毁,通常都是成对出现
如何构建BeanDefinition?
- 通过 BeanDefinitionBuilder 构建
- 通过 AbstractBeanDefinition 以及派生类
注意细节⚠️
BeanDefinitionBuilder提供了两种方式获取BeanDefinitionBuilder
// 普通方式获取,非根的Bean,可以有父类BeanDefinitionBuilder#genericBeanDefinition // 根节点获取,只能获取根节点Bean即最顶层BeanBeanDefinitionBuilder#rootBeanDefinition
实例
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