Spring BeanDefinitionHolder源码解析
BeanDefinitionHolder源码解析
继承关系

实现的接口
和BeanDefinition一样实现了BeanMetadataElement接口,获得了获取数据源(配置类的class对象)的能力。
/**
* 将由承载配置源对象的bean元数据元素实现的接口。
*/
public interface BeanMetadataElement {
/**
* 返回此元数据元素的配置源{@code Object}(可以为{@code null})。
*/
@Nullable
default Object getSource() {
return null;
}
}
本类解析
具有名称和别名的BeanDefinition的持有人。 可以注册为内部bean的占位符。 还可以用于内部bean定义的程序化注册。 如果您不关心BeanNameAware之类的东西,那么注册RootBeanDefinition或ChildBeanDefinition就足够了。
public class BeanDefinitionHolder implements BeanMetadataElement {
/**
* 要包含的BeanDefinition
*/
private final BeanDefinition beanDefinition;
/**
* BeanDefinition对应的beanName
*/
private final String beanName;
/**
* BeanDefinition对应的别名集合
*/
@Nullable
private final String[] aliases;
/**
* 创建一个新的BeanDefinitionHolder。
* @param beanDefinition 要包装的BeanDefinition
* @param beanName bean名称,为bean定义指定的名称
*/
public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName) {
this(beanDefinition, beanName, null);
}
/**
* 创建一个新的BeanDefinitionHolder。
* @param beanDefinition bean包装的BeanDefinition
* @param beanName 为bean定义指定的bean名称。
* @param aliases bean的别名,或者{@code null}(如果没有)
*/
public BeanDefinitionHolder(BeanDefinition beanDefinition, String beanName, @Nullable String[] aliases) {
Assert.notNull(beanDefinition, "BeanDefinition must not be null");
Assert.notNull(beanName, "Bean name must not be null");
this.beanDefinition = beanDefinition;
this.beanName = beanName;
this.aliases = aliases;
}
/**
* 复制构造函数:创建一个新的BeanDefinitionHolder,其内容与给定的BeanDefinitionHolder实例相同。
* <p>注意:包装好的BeanDefinition引用按原样使用;
* 这不是深度复制。
* @param beanDefinitionHolder 要复制的BeanDefinitionHolder
*/
public BeanDefinitionHolder(BeanDefinitionHolder beanDefinitionHolder) {
Assert.notNull(beanDefinitionHolder, "BeanDefinitionHolder must not be null");
this.beanDefinition = beanDefinitionHolder.getBeanDefinition();
this.beanName = beanDefinitionHolder.getBeanName();
this.aliases = beanDefinitionHolder.getAliases();
}
/**
* 返回包装的BeanDefinition。
*
*/
public BeanDefinition getBeanDefinition() {
return this.beanDefinition;
}
/**
* 返回为bean定义指定的bean的主要名称。
*
*/
public String getBeanName() {
return this.beanName;
}
/**
* 返回直接为bean定义指定的bean的别名。
* @return 别名名称的数组;
* 如果没有别名,则为{<@@code> null}
*/
@Nullable
public String[] getAliases() {
return this.aliases;
}
/**
* 公开bean定义的源对象。
*
* @see BeanDefinition#getSource()
*/
@Override
@Nullable
public Object getSource() {
return this.beanDefinition.getSource();
}
/**
* 确定给定的候选名称是否与Bean名称或此Bean定义中存储的别名匹配。
*/
public boolean matchesName(@Nullable String candidateName) {
return (candidateName != null && (candidateName.equals(this.beanName) ||
candidateName.equals(BeanFactoryUtils.transformedBeanName(this.beanName)) ||
ObjectUtils.containsElement(this.aliases, candidateName)));
}
/**
* 返回该bean的友好简短描述,名称和别名。
* @see #getBeanName()
* @see #getAliases()
*/
public String getShortDescription() {
if (this.aliases == null) {
return "Bean definition with name '" + this.beanName + "'";
}
return "Bean definition with name '" + this.beanName + "' and aliases [" + StringUtils.arrayToCommaDelimitedString(this.aliases) + ']';
}
/**
* 返回该bean的详细描述,包括名称和别名,以及对包含的{@link BeanDefinition}的描述。
*
* @see #getShortDescription()
* @see #getBeanDefinition()
*/
public String getLongDescription() {
return getShortDescription() + ": " + this.beanDefinition;
}
/**
* 此实现返回详细描述。
* 可以重写以返回简短描述或任何类型的自定义描述。
*
* @see #getLongDescription()
* @see #getShortDescription()
*/
@Override
public String toString() {
return getLongDescription();
}
@Override
public boolean equals(@Nullable Object other) {
if (this == other) {
return true;
}
if (!(other instanceof BeanDefinitionHolder)) {
return false;
}
BeanDefinitionHolder otherHolder = (BeanDefinitionHolder) other;
return this.beanDefinition.equals(otherHolder.beanDefinition) &&
this.beanName.equals(otherHolder.beanName) &&
ObjectUtils.nullSafeEquals(this.aliases, otherHolder.aliases);
}
@Override
public int hashCode() {
int hashCode = this.beanDefinition.hashCode();
hashCode = 29 * hashCode + this.beanName.hashCode();
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.aliases);
return hashCode;
}
}
总结
BeanDefinitionHolder就是BeanDefinition + beanName + beanAlias的持有者。
疑问:
BeanNameAware是啥?
Spring BeanDefinitionHolder源码解析的更多相关文章
- Spring IoC源码解析之invokeBeanFactoryPostProcessors
一.Bean工厂的后置处理器 Bean工厂的后置处理器:BeanFactoryPostProcessor(触发时机:bean定义注册之后bean实例化之前)和BeanDefinitionRegistr ...
- Spring系列(三):Spring IoC源码解析
一.Spring容器类继承图 二.容器前期准备 IoC源码解析入口: /** * @desc: ioc原理解析 启动 * @author: toby * @date: 2019/7/22 22:20 ...
- spring事务源码解析
前言 在spring jdbcTemplate 事务,各种诡异,包你醍醐灌顶!最后遗留了一个问题:spring是怎么样保证事务一致性的? 当然,spring事务内容挺多的,如果都要讲的话要花很长时间, ...
- Spring IoC源码解析之getBean
一.实例化所有的非懒加载的单实例Bean 从org.springframework.context.support.AbstractApplicationContext#refresh方法开发,进入到 ...
- Spring系列(五):Spring AOP源码解析
一.@EnableAspectJAutoProxy注解 在主配置类中添加@EnableAspectJAutoProxy注解,开启aop支持,那么@EnableAspectJAutoProxy到底做了什 ...
- Spring系列(六):Spring事务源码解析
一.事务概述 1.1 什么是事务 事务是一组原子性的SQL查询,或者说是一个独立的工作单元.要么全部执行,要么全部不执行. 1.2 事务的特性(ACID) ①原子性(atomicity) 一个事务必须 ...
- Spring Boot系列(四):Spring Boot源码解析
一.自动装配原理 之前博文已经讲过,@SpringBootApplication继承了@EnableAutoConfiguration,该注解导入了AutoConfigurationImport Se ...
- Spring Security源码解析一:UsernamePasswordAuthenticationFilter之登录流程
一.前言 spring security安全框架作为spring系列组件中的一个,被广泛的运用在各项目中,那么spring security在程序中的工作流程是个什么样的呢,它是如何进行一系列的鉴权和 ...
- Spring IoC源码解析——Bean的创建和初始化
Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和AOP的容器框架,主要是针对JavaBean的生命周期进行管理的轻量级容器 ...
随机推荐
- 第3章 JDK并发包(三)
3.2 线程复用:线程池 一种最为简单的线程创建和回收的方法类似如下代码: new Thread(new Runnable() { @Override public void run() { // d ...
- window10 vs2013 SIFTGPU
碰到的问题: 1.一大推语法错误: 所有For_EACH_OCTAVE的地方都出现了语法错误.后来查找了一下For_EACH_OCTAVE是个啥,发现是一个宏定义,也不知道宏定义定义的好好的,为啥会编 ...
- 【TensorFlow】TensorFlow基础 —— 模型的保存读取与可视化方法总结
TensorFlow提供了一个用于保存模型的工具以及一个可视化方案 这里使用的TensorFlow为1.3.0版本 一.保存模型数据 模型数据以文件的形式保存到本地: 使用神经网络模型进行大数据量和复 ...
- 日志框架 log4j2 全解析
概述 logging翻译为日志记录 那问题是什么是日志? 日志实际上是日记的一种,用于记录某个时间点发生了什么事情,比如大学老师的教学日志,工作日志等 为什么要记录日志? 在实际生活中记录日志主要为了 ...
- JAVA中voltatile关键字的使用
1.首先要明白一个概念 JAVA中主内存和线程工作内存的概念. 如果有一个static的变量,值会存储在主内存.如果多个线程访问这个变量,每个线程都会将变量的值拷贝到自己的工作内存,之后的操作就是针对 ...
- kubeadm安装Kubernetes 1.14最佳实践
前言 Kubernetes作为容器编排工具,简化容器管理,提升工作效率而颇受青睐.很多新手部署Kubernetes由于“上网”问题举步维艰,本文以实战经验详解kubeadm不用“翻墙”部署Kubern ...
- [Linux]curl 测试socket http代理
Socket5 curl --socks5 10.2.46.19:10808 http://www.baidu.com #-----查询结果----- <!DOCTYPE html> &l ...
- 配置nginx代理服务器访问tomcat服务
nginx原配置文件如下: #user nobody; worker_processes ; #error_log logs/error.log; #error_log logs/error.log ...
- 直接使用汇编编写 .NET Standard 库
前言 Common Language Runtime(CLR)是一个很强大的运行时,它接收 Common Intermediate Language(CIL) 的输入并最终产生机器代码并执行.CIL ...
- matlab---设置背景颜色为白色
(1)每次设置figure('color','w');或者figure('color',[1 1 1])或者set(gcf,'color','w'); (2)一次性:在命令行内输入 set(0,'de ...