3.8 spring - AbstractBeanDefinition 介绍
之前,我们已尽完成了xml 文档到 GenericBeanDefinition的转换,
也就是说,到这里,所有的配置都可以在GenericBeanDefinition 的实例中找到对应的配置.
GenericBeanDefinition只是子类实现,而大部分功能都是通用属性,都是保存在AbstractBeanDefinition中,
那么我们再次通过AbstractBeanDefinition 的属性来复习一下 我们都解析了哪些对应的配置.
AbstractBeanDefinition 的结果图如下:

我们在来看看源代码!
/**
* Base class for concrete, full-fledged
* {@link org.springframework.beans.factory.config.BeanDefinition} classes, factoring out
* common properties of {@link RootBeanDefinition} and {@link ChildBeanDefinition}.
*
* <p>
* The autowire constants match the ones defined in the
* {@link org.springframework.beans.factory.config.AutowireCapableBeanFactory} interface.
*
* @author Rod Johnson
* @author Juergen Hoeller
* @author Rob Harrop
* @author Mark Fisher
* @see RootBeanDefinition
* @see ChildBeanDefinition
*/
@SuppressWarnings("serial")
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
implements BeanDefinition, Cloneable { /**
* Constant for the default scope name: "", equivalent to singleton status but to be
* overridden from a parent bean definition (if applicable).
*
* 常数为默认作用域的名称:“”,相当于单身状态,但是从父bean定义(如适用)所覆盖。
*
*/
public static final String SCOPE_DEFAULT = ""; /**
* Constant that indicates no autowiring at all.
*
* 常数,指示没有自动装配。
*
* @see #setAutowireMode
*/
public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO; /**
* Constant that indicates autowiring bean properties by name.
*
* 常数,表示按name自动装配bean的属性。
*
* @see #setAutowireMode
*/
public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME; /**
* Constant that indicates autowiring bean properties by type.
*
* 常数,指示按类型自动装配bean的属性。
*
* @see #setAutowireMode
*/
public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE; /**
* Constant that indicates autowiring a constructor.
*
* 常数,表示自动装配一个构造。
*
* @see #setAutowireMode
*/
public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR; /**
* Constant that indicates determining an appropriate autowire strategy through
* introspection of the bean class.
*
* 常数指示不依赖检查。
*
* @see #setAutowireMode
* @deprecated as of Spring 3.0: If you are using mixed autowiring strategies, use
* annotation-based autowiring for clearer demarcation of autowiring
* needs.
*/
@Deprecated
public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT; /**
* Constant that indicates no dependency check at all.
*
* 常数,表示为对象引用的依赖检查。
*
* @see #setDependencyCheck
*/
public static final int DEPENDENCY_CHECK_NONE = 0; /**
* Constant that indicates dependency checking for object references.
*
* 常数,表示为对象引用的依赖检查。
*
* @see #setDependencyCheck
*/
public static final int DEPENDENCY_CHECK_OBJECTS = 1; /**
* Constant that indicates dependency checking for "simple" properties.
*
* 常数,指出“简单”的属性的依赖检查。
*
* @see #setDependencyCheck
* @see org.springframework.beans.BeanUtils#isSimpleProperty
*/
public static final int DEPENDENCY_CHECK_SIMPLE = 2; /**
* Constant that indicates dependency checking for all properties (object references
* as well as "simple" properties).
*
* 常数,指示所有属性的依赖检查
*
* @see #setDependencyCheck
*/
public static final int DEPENDENCY_CHECK_ALL = 3; /**
* Constant that indicates the container should attempt to infer the
* {@link #setDestroyMethodName destroy method name} for a bean as opposed to explicit
* specification of a method name. The value {@value} is specifically designed to
* include characters otherwise illegal in a method name, ensuring no possibility of
* collisions with legitimately named methods having the same name.
*
* 常数,方法检查
*/
public static final String INFER_METHOD = "(inferred)"; /**
* 应该是这个bean的Class类型吧
*/
private volatile Object beanClass; /**
* bean的作用范围,对应Bean属性scope
*/
private String scope = SCOPE_DEFAULT; /**
* 是否是抽象Bean ,对应bean属性abstractFlag
*/
private boolean abstractFlag = false; /**
* 是否延迟加载,对应Bean属性lazy-init
*/
private boolean lazyInit = false; /**
* 自动注入模式,,对应Bean属性autowire
*/
private int autowireMode = AUTOWIRE_NO; /**
* 依赖检查,Spring 3.0后弃用这个属性
*/
private int dependencyCheck = DEPENDENCY_CHECK_NONE; /**
* 用来表示一个Bean的实例化依靠另一个Bean先实例化,对应Bean属性depend-on
*/
private String[] dependsOn; /**
* autowire-candidate属性设置为false,这样容器在查找自动装配对象时,将不考虑该bean,即它不会被考虑为其他bean自动装配的候选者,
* 但是该bean本身还是可以使用自动装配来注入其他属性,
*
* 对应Bean属性autowire-candidate
*/
private boolean autowireCandidate = true; /**
* 自动装配当出现多个bean候选者,将作为首选者,是默认不是主要候选者,对应Bean属性primary
*/
private boolean primary = false; /**
* 用于记录qualifiers ,对应Bean属性qualifier
*/
private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<String, AutowireCandidateQualifier>(
0); /**
* 允许访问非公开的构造器和方法
*/
private boolean nonPublicAccessAllowed = true; /**
* 是否以一种宽松的模式解析构造函数,默认为true,
*
* 如果为false,则在如下情况,
*
* interface Person{}
*
* class Theacher implemente Person{}
*
* class Main{
*
* Main(Person p){}
*
* Main(Theacher t){}
*
* 抛出异常,因为Spring无法准确定位哪个构造函数,
*
* 程序设置
*
* }
*
*/
private boolean lenientConstructorResolution = true; /**
* 记录构造函数注入属性, 对应Bean属性constructor-arg
*/
private ConstructorArgumentValues constructorArgumentValues; /**
* 普通属性的集合
*/
private MutablePropertyValues propertyValues; /**
* 方法重写的持有者 ,记录 lookup-method,replaced-method元素
*/
private MethodOverrides methodOverrides = new MethodOverrides(); /**
* 对应Bean的factory-bean 的属性,用法:
*
* <bean id = "factoryBean" class = "test.TestFactoryBean">
*
* <bean id = "ct" factory-bean= "factoryBean" factory-method = "getBean">
*
*
*/
private String factoryBeanName; /**
* 这个bean的工厂方法名
*/
private String factoryMethodName; /**
* 这个bean的初始化方法名
*/
private String initMethodName; /**
* 这个bean的销毁方法名
*/
private String destroyMethodName; /**
* 是否执行 init-method 方法,默认执行初始化方法,程序设置
*/
private boolean enforceInitMethod = true; /**
* 是否执行 destory-method 方法,默认执行销毁方法,程序设置
*/
private boolean enforceDestroyMethod = true; /**
* 是否是用户定义的而不是应用程序本身定义的, 创建AOP的时候为true,程序设置
*/
private boolean synthetic = false; /**
* 定义这个bean的应用,
*
* ROLE_APPLICATION:用户,
*
* ROLE_INFRASTRUCTURE:完全内部使用,与用户无关;
*
* ROLE_SUPPORT:某些复杂配置的一部分
*/
private int role = BeanDefinition.ROLE_APPLICATION; /**
* bean 的描述信息
*/
private String description; /**
* 这个Bean定义的资源
*/
private Resource resource; /**
* Create a new AbstractBeanDefinition with default settings.
*/
protected AbstractBeanDefinition() {
this(null, null);
} /**
* Create a new AbstractBeanDefinition with the given constructor argument values and
* property values.
*/
/*
* 创建新的AbstractBeanDefinition实例并给定ConstructorArgumentValues实例和MutabePropertyValues实例
*/
protected AbstractBeanDefinition(ConstructorArgumentValues cargs,
MutablePropertyValues pvs) {
setConstructorArgumentValues(cargs);
setPropertyValues(pvs);
} /**
* Create a new AbstractBeanDefinition as a deep copy of the given bean definition.
*
* @param original the original bean definition to copy from
*/
/*
* 创建一个新的AbstractBeanDefinition并深入拷贝给定的BeanDefinition实例
*/
protected AbstractBeanDefinition(BeanDefinition original) {
// 抽象方法,由子类实现,设置父类名
setParentName(original.getParentName());
// 设置这个bean的类名称
setBeanClassName(original.getBeanClassName());
// 设置这个bean的工厂bean名称
setFactoryBeanName(original.getFactoryBeanName());
// 设置这个bean的工厂方法名称
setFactoryMethodName(original.getFactoryMethodName());
// 设置这个bean的作用范围,如单例的还是原型的,也有可能是其它的
setScope(original.getScope());
// 设置这个bean是否是抽象的
setAbstract(original.isAbstract());
// 设置这个bean是否开启延载初始化
setLazyInit(original.isLazyInit());
// 设置这个bean的角色
setRole(original.getRole());
// 设置这个bean的构造参数持有者
setConstructorArgumentValues(new ConstructorArgumentValues(
original.getConstructorArgumentValues()));
// 设置这个bean的Property持有者
setPropertyValues(new MutablePropertyValues(original.getPropertyValues()));
// 设置这个bean的配置源
setSource(original.getSource());
// 这个bean复制属性组名称
copyAttributesFrom(original);
// 判断origina是否是AbstractBeanDefinition子类
if (original instanceof AbstractBeanDefinition) {
AbstractBeanDefinition originalAbd = (AbstractBeanDefinition) original;
if (originalAbd.hasBeanClass()) {
// 设置这个bean的Class类型
setBeanClass(originalAbd.getBeanClass());
}
// 设置这个bean的自动装配模式
setAutowireMode(originalAbd.getAutowireMode());
// 设置这个bean的依赖检查
setDependencyCheck(originalAbd.getDependencyCheck());
// 设置这个bean初始化要依赖的bean名称数组
setDependsOn(originalAbd.getDependsOn());
// 设置这个bean是否自动装配候选
setAutowireCandidate(originalAbd.isAutowireCandidate());
// 设置这个bean的qualifier
copyQualifiersFrom(originalAbd);
// 设置这个bean是否是主要候选者
setPrimary(originalAbd.isPrimary());
// 设置是否允许访问非public的构造器和方法
setNonPublicAccessAllowed(originalAbd.isNonPublicAccessAllowed());
// 设置是否以一种宽松的模式解析构造函数
setLenientConstructorResolution(originalAbd.isLenientConstructorResolution());
// 设置这个bean的初始化方法名
setInitMethodName(originalAbd.getInitMethodName());
// 设置是否执行初始化方法
setEnforceInitMethod(originalAbd.isEnforceInitMethod());
// 设置这个bean的销毁方法名
setDestroyMethodName(originalAbd.getDestroyMethodName());
// 设置是否执行销毁方法
setEnforceDestroyMethod(originalAbd.isEnforceDestroyMethod());
// 设置这个bean的方法重写持有者
setMethodOverrides(new MethodOverrides(originalAbd.getMethodOverrides()));
// 设置这个bean是人造的或者是应用程序本身
setSynthetic(originalAbd.isSynthetic());
// 设置这个Bean定义的资源
setResource(originalAbd.getResource());
}
else {
setResourceDescription(original.getResourceDescription());
}
}
代码中的注释已经相当详细了,这里不多做解释!
3.8 spring - AbstractBeanDefinition 介绍的更多相关文章
- Spring Batch 中文参考文档 V3.0.6 - 1 Spring Batch介绍
1 Spring Batch介绍 企业领域中许多应用系统需要采用批处理的方式在特定环境中运行业务操作任务.这种业务作业包括自动化,大量信息的复杂操作,他们不需要人工干预,并能高效运行.这些典型作业包括 ...
- [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续
英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...
- Spring 的介绍和目标
1. Spring介绍 打开Spring 官网查看对 Spring 的介绍和目标 http://www.springsource.org/about We believe that: · J2EE s ...
- Spring的介绍与搭建
一.Spring的介绍 二.Spring的搭建 (1)导包 (2)创建一个对象 (3)书写配置注册对象到容器 (4)代码测试
- Spring Shell介绍
最近开发中在下遇到了spring-shell开发工具的项目,现在整理了相关文章,以供大家学习 本博客相关的文章均是在Spring Shell 1.2.0的基础上建立 Spring Shell介绍 ...
- Spring DevTools 介绍
Spring DevTools 介绍 Spring Boot包括一组额外的工具,可以使应用程序开发体验更加愉快. spring-boot-devtools模块可以包含在任何项目中,它可以节省大量的时间 ...
- 第1章—Spring之旅—Spring模块介绍
Spring模块介绍 Spring7大核心模块: 核心容器(Spring Core) 核心容器提供Spring框架的基本功能.Spring以bean的方式组织和管理Java应用中的各个组件及其关系.S ...
- Spring Security 介绍与Demo
一.Spring Security 介绍 Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块的默认技术选型.我们仅需引入spring-boot-s ...
- [转帖]微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务
微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务 http://skaka.me/blog/2016/04/21/springcloud1/ APR 21ST, ...
随机推荐
- Myeclipse中tomcat所应用的JDK设置
Preferences------ > MyElipse ---------- >Servers ----------- > Tomcat-------- >Tomcat 6. ...
- Ajax--跨域访问的三种方法
一.什么是跨域 我们先回顾一下域名地址的组成: / script/jquery.js http:// (协议号) www (子域名) google (主域名) (端口号) script/jquer ...
- PS基础学习 2---图层蒙版
1,蒙版,字面意思上的理解就是:把底层图片上面加上一层图层蒙着,通过画笔工具控制底层图片和上面一层图层的显示效果.常用于图层的无缝隙合成. 我们可以先看一下下面的这个小例子,这个就是蒙版的一个小应用: ...
- 注意java的对象引用
要注意,当前拿到的“对象引用”, 是不是 指向 最新的实例, 没有的话, 要重新 生成实例去指向. 代码例子: AnsweringRuleInfo bhRule = accountGenerator. ...
- 第六十六篇、OC_Sqlite数据库操作
#import <Foundation/Foundation.h> #import <sqlite3.h> #define kFilename @"data.sqli ...
- autolayout高度动态改变的一些体会
autolayout这个东西就不在此说明了,网上已经有很多大神做了很详细的讲解,自己也看了不少好文章,在这里只是想记录一下自己初步的一些认识与体会,这个东西毕竟还是很强大,如果要用到更高级的用法还得在 ...
- C#判断Textbox是否为数字
第一种方法: try { ) { //操作代码 } else { MessageBox.Show("必须是正整数"); } } catch (FormatException) { ...
- java新手笔记28 文件
1.目录.文件 package com.yfs.javase; import java.io.File; public class FileDemo1 { /** * File 目录 文件 */ pu ...
- java web 简单的分页显示
题外话:该分页显示是用 “表示层-控制层-DAO层-数据库”的设计思想实现的,有什么需要改进的地方大家提出来,共同学习进步. 思路:首先得在 DAO 对象中提供分页查询的方法,在控制层调用该方法查到指 ...
- Contest1065 - 第四届“图灵杯”NEUQ-ACM程序设计竞赛(个人赛)C粉丝与汉诺塔
题目描述 苟利国家生死以,岂因福祸避趋之?作为ACM真正的粉丝,应该都听闻过汉诺塔问题,汉诺塔问题是这样的: 有三根柱子,编号A,B,C柱,初始情况下A柱上有n个盘子,小盘子在上大盘子在下,n个盘子大 ...