Spring 源码分析(二)——GenericBeanDefinition 分析

BeanDefinition 中存储着 Bean 的定义信息,它具有属性值、构造函数参数值以及具体实现 Bean 提供的进一步信息,在学习 SpringBean 初始化流程之前,还是非常有必要先了解一下 BeanDefinition

一、注册 Bean 示例

首先,本文先举一个使用 BeanDefinition 创建 Bean 的小例子:

import com.nineya.spring.entity.Post;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.beans.PropertyValue;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.GenericBeanDefinition;

import java.util.ArrayList;
import java.util.List;

public class SpringMain {
    public static void main(String[] args) {
        // 创建bean工厂
        DefaultListableBeanFactory context = new DefaultListableBeanFactory();

        //构造bean定义
        GenericBeanDefinition gbd = new GenericBeanDefinition();
        gbd.setBeanClass(Post.class);

        // 设置属性
        List<PropertyValue> propertyValues = new ArrayList<>();
        propertyValues.add(new PropertyValue("id", 123L));
        propertyValues.add(new PropertyValue("title", "title"));
        gbd.setPropertyValues(new MutablePropertyValues(propertyValues));

        //注册到环境上下文
        context.registerBeanDefinition("post", gbd);

        // 通过class取得bean
        Post post = context.getBean(Post.class);
        System.out.println(post + " : " + post.hashCode());

        // 通过名称取得bean
        post = (Post) context.getBean("post");
        System.out.println(post + " : " + post.hashCode());
    }
}

执行结果输出:

Post(id=123, title=title, categories=null, tags=null, content=null) : 1339167804
Post(id=123, title=title, categories=null, tags=null, content=null) : 1339167804

二、GenericBeanDefinition 结构

GenericBeanDefinition 类继承关系图如下:

GenericBeanDefinition 类继承关系图

逐个对 GenericBeanDefinition 继承的类/接口进行分析:

BeanMetadataElement 接口: BeanMetadataElement 提供了获取数据源的方式,也就是可以指导 Bean 是来自哪个类,由携带配置源对象的 Bean 元数据元素实现的接口。

接口说明
Object getSource()返回此元数据元素的配置源

AttributeAccessorSupport 抽象类: 支持 AttributeAccessor 属性存取接口,内部使用的 LinkedHashMap,提供
所有方法的基本实现,由子类扩展。

接口说明
void setAttribute(String name, @Nullable Object value)设置属性
Object getAttribute(String name)取得属性
Object removeAttribute(String name)删除并返回属性
boolean hasAttribute(String name)判断属性是否存在
String[] attributeNames()取得所有属性的名称

以上这两个接口的实现皆与 GenericBeanDefinition 无关联,这是公共的基础类。

BeanMetadataAttributeAccessor 类: 将元数据参数封装为 BeanMetadataAttribute,用于 Bean 的元数据和属性上下文操作的实现类。

接口说明
void setSource(@Nullable Object source)为这个元数据元素设置配置源
void addMetadataAttribute(BeanMetadataAttribute attribute)将给定的BeanMetadataAttribute添加到该访问器的属性集
BeanMetadataAttribute getMetadataAttribute(String name)在这个访问器的属性集中查找给定的BeanMetadataAttribute

BeanDefinition 接口

接口说明
void setParentName(@Nullable String parentName)设置此 bean 定义的父定义的名称(如果有的话)
String getParentName()返回此 bean 定义的父定义的名称(如果有的话)
void setBeanClassName(@Nullable String beanClassName)指定此 bean 定义的 bean 类名。类名可以在 bean 工厂后期处理期间修改,通常是用解析后的类名替换原来的类名
String getBeanClassName()返回此 bean 定义的当前bean类名称。注意,这并不一定是运行时使用的实际类名,例如子定义覆盖/继承其父类名。
void setScope(@Nullable String scope)重写此 bean 的目标范围,指定一个新的范围名
String getScope()返回此 bean 的当前目标作用域的名称
void setLazyInit(boolean lazyInit)设置该 bean 是否应该延迟初始化
boolean isLazyInit()返回该 bean 是否应该延迟初始化,即在启动时实例化
void setDependsOn(@Nullable String… dependsOn)设置此 bean 所依赖的初始化 bean 的名称, bean 工厂将保证这些 bean 首先被初始化
String[] getDependsOn()返回此 bean 所依赖的初始化 bean 的名称
void setAutowireCandidate(boolean autowireCandidate)设置该 bean 是否为自动连接到其他 bean 的候选 bean
boolean isAutowireCandidate()返回该 bean 是否是自动连接到其他 bean 的候选 bean
void setPrimary(boolean primary)设置此 bean 是否为主要自动装配候选
boolean isPrimary()返回此 bean 是否是自动装配的主要候选
void setFactoryBeanName(@Nullable String factoryBeanName)指定要使用的工厂 bean 名称
String getFactoryBeanName()返回工厂 bean 名称(如果有的话)
void setFactoryMethodName(@Nullable String factoryMethodName)指定一个工厂方法,该方法将使用构造函数参数调用,如果没有指定参数,则不使用参数调用。该方法将在指定的工厂 bean 上调用,或者作为本地 bean 类上的静态方法调用。
String getFactoryMethodName()返回一个工厂方法
ConstructorArgumentValues getConstructorArgumentValues()返回此 bean 的构造函数参数值
boolean hasConstructorArgumentValues()判断此 bean 是否定义了构造函数参数值
MutablePropertyValues getPropertyValues()返回应用于 bean 的新实例的属性值
boolean hasPropertyValues()判断此 bean 是否定义了属性值
void setInitMethodName(@Nullable String initMethodName)设置初始化器方法的名称
String getInitMethodName()返回初始化方法的名称
void setDestroyMethodName(@Nullable String destroyMethodName)设置销毁方法的名称
String getDestroyMethodName()返回销毁方法的名称
void setRole(int role)为这个 BeanDefinition 设置角色提示
int getRole()获取这个 BeanDefinition 的角色提示
void setDescription(@Nullable String description)设置此 bean 定义的人类可读的描述
String getDescription()取得此 bean 定义的人类可读的描述
ResolvableType getResolvableType()根据 bean 类或其他特定元数据,返回此 bean 定义的可解析类型
boolean isSingleton()判断此 bean 是否是单例
boolean isPrototype()判断此 bean 是否是原型
boolean isAbstract()返回此 bean 是否是“抽象的”,即不需要实例化
String getResourceDescription()返回此 bean 定义所来自的资源的描述(以便在出现错误时显示上下文)
BeanDefinition getOriginatingBeanDefinition()返回原始的 BeanDefinition

AbstractBeanDefinition 抽象类: AbstractBeanDefinition 是具体的、BeanDefinition 类的基类,分解出 GenericBeanDefinitionRootBeanDefinitionChildBeanDefinition 的公共属性和逻辑。

接口说明
void overrideFrom(BeanDefinition other)使用给定 BeanDefinition 定义重新当前 BeanDefinition 中的设置
void applyDefaults(BeanDefinitionDefaults defaults)将提供的默认值应用到此 bean
void setBeanClass(@Nullable Class<?> beanClass)为这个 bean 指定类
Class<?> getBeanClass() throws IllegalStateException返回 bean 定义的指定类
boolean hasBeanClass()返回该定义是否指定了 bean
Class<?> resolveBeanClass(@Nullable ClassLoader classLoader)确定被包装bean的类,如果需要,从指定的类名解析它
void setAbstract(boolean abstractFlag)默认为“false”。指定 true 告诉 bean 工厂在任何情况下都不要尝试实例化 bean
Boolean getLazyInit()返回该 bean 是否应该延迟初始化
void setAutowireMode(int autowireMode)设置自动装配模式。这决定是否会发生 bean 引用的自动检测和设置
int getAutowireMode()返回 bean 定义中指定的自动装配模式
int getResolvedAutowireMode()返回已解析的自动装配代码
void setDependencyCheck(int dependencyCheck)设置依赖项检查代码
int getDependencyCheck()返回依赖项检查代码
addQualifier(AutowireCandidateQualifier qualifier)注册一个用于自动装配候选解析的限定符,以限定符的类型名称为键值
boolean hasQualifier(String typeName)返回此 bean 是否具有指定的限定符
AutowireCandidateQualifier getQualifier(String typeName)返回映射到所提供类型名称的限定符
Set<AutowireCandidateQualifier> getQualifiers()返回所有已注册的限定符
void copyQualifiersFrom(AbstractBeanDefinition source)将所提供的 AbstractBeanDefinition 中的限定符复制到当前 BeanDefinition
public void setInstanceSupplier(@Nullable Supplier<?> instanceSupplier)指定用于创建 bean 实例的回调,作为声明式指定工厂方法的替代方法
Supplier<?> getInstanceSupplier()返回用于创建 bean 实例的回调(如果有的话)
void setNonPublicAccessAllowed(boolean nonPublicAccessAllowed)指定是否允许访问非公共构造函数和方法,如果外部化元数据指向它们
boolean isNonPublicAccessAllowed()返回是否允许访问非公共构造函数和方法
void setLenientConstructorResolution(boolean lenientConstructorResolution)指定是否在宽限模式下解析构造函数
boolean isLenientConstructorResolution()返回以宽松模式还是严格模式解析构造函数
void setConstructorArgumentValues(ConstructorArgumentValues constructorArgumentValues)为这个 bean 指定构造函数参数值
void setPropertyValues(MutablePropertyValues propertyValues)指定此 bean 的属性值(如果有的话)
void setMethodOverrides(MethodOverrides methodOverrides)bean 指定方法重写(如果有的话)
MethodOverrides getMethodOverrides()返回 IoC 容器要覆盖的方法的信息。如果没有方法重写,该参数将为空。
boolean hasMethodOverrides()是否为此 bean 定义了方法重写
void setEnforceInitMethod(boolean enforceInitMethod)指定配置的初始化方法是否为默认值
boolean isEnforceInitMethod()指示配置的初始化方法是否为默认值
void setEnforceDestroyMethod(boolean enforceDestroyMethod)设置配置的销毁方法是否为默认值
boolean isEnforceDestroyMethod()指定配置的销毁方法是否为默认值
void setSynthetic(boolean synthetic)设置这个 bean 定义是否是“合成的”
boolean isSynthetic()返回此 bean 定义是否是“合成的”,即不是由应用程序本身定义的
void setResource(@Nullable Resource resource)设置此 bean 定义所来自的资源(以便在出现错误时显示上下文)
setResourceDescription(@Nullable String resourceDescription)设置此 bean 定义所来自的资源的描述(以便在出现错误时显示上下文)
void setOriginatingBeanDefinition(BeanDefinition originatingBd)如果有的话,设置原始的(例如装饰过的) BeanDefinition
void validate() throws BeanDefinitionValidationException验证这个 BeanDefinition
void prepareMethodOverrides() throws BeanDefinitionValidationException验证并准备为此 bean 定义的方法重写。检查具有指定名称的方法是否存在
void prepareMethodOverride(MethodOverride mo) throws BeanDefinitionValidationException验证并准备给定的方法重写。检查具有指定名称的方法是否存在,如果没有找到则将其标记为未重载

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/9878.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SQL Server的日志传送

日志传送和复制一、前言二、相关术语和定义三、日志传送和复制3.1、在主数据库丢失时从辅助数据库进行复制的要求和过程3.2、使用事务复制进行日志传送3.3、使用合并复制进行日志传送一、前言 日志传送允许您自动将事务日志备份从主服务器实例上的主数据库发送到单独辅助服务器…

高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

目录前言一、nohup命令详解1-1、nohup命令介绍1-2、语法格式1-2-1、基础语法介绍1-2-2、执行脚本文件1-2-3、执行python文件1-2-4、拓展延申&#xff1a;在服务器上运行后台进程1-2-5、nohup和&的区别二、进程查看2-1、jobs命令&#xff08;基本不用&#xff09;2-2、ps命令…

Msray-Plus采集工具让您的市场营销更加简单,让您的营销成果更加显著

市场营销是现代企业不可或缺的一环&#xff0c;企业的发展和营销成果密不可分。然而&#xff0c;市场营销的过程中&#xff0c;需要大量的数据采集和整理工作&#xff0c;这对于营销人员来说是一项繁琐的工作&#xff0c;同时也是一项非常重要的工作。因为数据的准确性和完整性…

NumPy 秘籍中文第二版:十二、使用 NumPy 进行探索性和预测性数据分析

原文&#xff1a;NumPy Cookbook - Second Edition 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 在本章中&#xff0c;我们涵盖以下秘籍&#xff1a; 探索气压探索日常气压范围研究年度气压平均值分析最大可见度用自回归模型预测气压使用移动平均模型预测气压研究年…

吐血奉献精心整理的一大波数据集

80开源数据集资源汇总&#xff08;包含目标检测、医学影像、关键点检测、工业检测等方向&#xff09; 数据集下载汇总链接&#xff1a;https://www.cvmart.net/dataSets数据集将会不断更新&#xff0c;欢迎大家持续关注&#xff01; 小目标检测 AI-TOD航空图像数据集 数据集…

【消息队列】聊一下生产者消息发送流程

消息发送流程 1.生产者main线程调用send发送消息&#xff0c;先走拦截器&#xff0c;然后会将消息进行序列化&#xff0c;然后选择对应的分区器&#xff0c;将消息发送到RecordAccumulator中&#xff0c;默认是32m 2.Sender线程会异步读取&#xff0c;要不数据达到batch的大小 …

7nm舱泊一体SoC的新玩家

2016年&#xff0c;高通推出基于14纳米工艺的汽车座舱芯片骁龙820A&#xff0c;彼时&#xff0c;传统座舱SoC霸主NXP主推的是28纳米工艺的iMX8系列。不过&#xff0c;两款芯片都没有能够达到预期的量产效果。 真正的时代变革&#xff0c;来自于高通在2019年发布的全球首款量产7…

三大前端框架Vue, Angular, React

今天就来好好分析分析这三个框架。 背景介绍 Angular Angular 是 Google 在 2010 年发布的 AngularJS 的升级版&#xff0c;也称为 Angular 2。AngularJS 是由 Misko Hevery 和 Adam Abrons 在 2009 年创建的&#xff0c;最初被称为 "GetAngular"&#xff0c;并于…

月薪过 3w 的 软件测试工程师 都是怎么做到的?

对任何职业而言&#xff0c;薪资始终都会是众多追求的重要部分。前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。 当然&#xff0c;我说的是最基础的功能测试的岗…

国网B接口调阅实时视频规范解读和代码示例分析

接口描述 国网B接口调阅实时视频&#xff0c;相关规范写的比较粗略&#xff1a; 调阅实时视频包括信令接口和媒体流接口&#xff0c;采用标准的SIP INVITESDP流程&#xff0c;媒体传输使用RTP/RTCP。 SDP 中 RTP Payload 的取值应遵守下面接口参数中的定义&#xff1a; a&a…

代码随想录_二叉树_leetcode236

leetcode 236. 二叉树的最近公共祖先 236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、…

Java阶段一Day19

Java阶段一Day19 文章目录Java阶段一Day19对象流字符流WriterReader转换流缓冲字符流BufferedWriter与PrintWriterBufferedReader异常Throwable、Error、Exception异常处理机制throwthrowstry-catchfinally面试题教师总结新单词JAVA IO对象流对象输入流构造器方法例transient关…

多模态模型技术综述

多模态架构导语1. Image2Text1.1 图像数据集准备1.2 图像to文本的生成模型1.2.1 M2 模型&#xff08;Meshed—Memory Transformer&#xff09;Memory-Augmented EncoderMeshed Decoder2. text2Image2.1 生成对抗网络&#xff08;GAN&#xff09;2.1.1 文本生成图像基础GAN2.1.2…

第一章 webpack与构建发展简史

官方loader和插件 Loaders | webpack Plugins | webpack 为什么需要构建工具&#xff1f; 初识webpack webpack默认配置文件&#xff1a;webpack.config.js 可以通过webpack --config <config_file_name>指定配置文件 rules是个数组&#xff0c;一个打包配置可以有多…

Hive概论、架构和基本操作

Hive是一个构建在Hadoop上的数据仓库框架&#xff0c;最初&#xff0c;Hive是由Facebook开发&#xff0c;后台移交由Apache软件基金会开发&#xff0c;并做为一个Apache开源项目。 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&a…

【数据库】面试题合集

1. 什么是索引?mysql 索引类型&#xff1f;索引是一种数据结构,可以帮助我们快速的进行数据的查找.1.普通索引2.唯一索引3.主键索引4.组合索引5.全文索引参考链接&#xff1a;https://www.cnblogs.com/luyucheng/p/6289714.html2. 索引是个什么样的数据结构呢?索引的数据结构…

【JS运算】分组求和/平均值(reduce函数)

对于数组求和的问题&#xff0c;使用reduce函数能够最快的解决 如果你还不会reduce函数&#xff0c;可以看这一篇&#xff1a; reduce函数的使用 思路 reduce函数对相同group的值进行迭代求和 将分组的总和除以组里的个数得到平均值&#xff0c;然后存储起来 Sum函数&#x…

2023 年 MQTT 协议的 7 个技术趋势|描绘物联网的未来

MQTT 是物联网消息传输标准协议&#xff0c;其采用极其轻量级的发布订阅消息模型&#xff0c;以可扩展、可靠且高效的方式连接物联网设备。 自 1999 年 IBM 发布 MQTT 以来已经过去了二十多年&#xff0c;而自 2012 年 EMQ 在 GitHub 上发布开源 MQTT 消息服务器 EMQX&#xf…

Python 小型项目大全 46~50

# 四十六、百万骰子投掷统计模拟器 原文&#xff1a;http://inventwithpython.com/bigbookpython/project46.html 当你掷出两个六面骰子时&#xff0c;有 17%的机会掷出 7。这比掷出 2 的几率好得多&#xff1a;只有 3%。这是因为只有一种掷骰子的组合给你 2&#xff08;当两个…

文件:IO流

1. 什么是IO /O 即输入Input/ 输出Output的缩写&#xff0c;其实就是计算机调度把各个存储中&#xff08;包括内存和外部存储&#xff09;的数据写入写出的过程&#xff1b;java中用“流&#xff08;stream&#xff09;”来抽象表示这么一个写入写出的功能&#xff0c;封装成一…
最新文章