这里主要是使用org.springframework:spring-beans:5.2.0.RELEASE进行分析
1. 查看源码相关的快捷键
快捷键 | 作用 |
---|---|
Ctrl + Shift+i | 出现类似于预览的小窗口 |
Ctrl + Enter | (接上步)完全打开源码 |
Ctrl + 鼠标左键 | 一步到位打开源码 = Ctrl + Shift+i –>Ctrl + Enter |
Alt+7 | 查看类的有什么方法 |
ctrl+f12 | 查看继承方法 |
ctrl+h | 查看接口的实现类 |
alt+7 | 查看类的有什么方法 |
一. AbstractBeanDefinition
-
AbstractBeanDefinition直接继承BeanDefiniton,实现了BeanDefinition定义的一系列操作,定义了描述Bean画像的一系列属性
-
GenericBeanDefinition的实例类中包含XML中所有的配置
-
GenericBeanDefinition只是子类实现,大部分的属性都保存在AbstractBeanDefinition中
-
AbstractBeanDefinition 相关子类
2. AbstractBeanDefinition 源码相关的属性
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
implements BeanDefinition, Cloneable {
// 默认的SCOPE,默认是单例
public static final String SCOPE_DEFAULT = "";
// 不进行自动装配
public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;
// 根据Bean的名字进行自动装配,即autowired属性的值为byname
public static final int AUTOWIRE_BY_NAME = AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
// 根据Bean的类型进行自动装配,调用setter函数装配属性,即autowired属性的值为byType
public static final int AUTOWIRE_BY_TYPE = AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
// 自动装配构造函数的形参,完成对应属性的自动装配,即autowired属性的值为byConstructor
public static final int AUTOWIRE_CONSTRUCTOR = AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
//通过Bean的class推断适当的自动装配策略(autowired=autodetect),如果Bean定义有有参构造函数,则通过自动装配构造函数形参,完成对应属性的自动装配(AUTOWIRE_CONSTRUCTOR),否则,使用setter函数(AUTOWIRE_BY_TYPE)
@Deprecated
public static final int AUTOWIRE_AUTODETECT = AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;
// 不进行依赖检查
public static final int DEPENDENCY_CHECK_NONE = 0;
// 如果依赖类型为对象引用,则需要检查
public static final int DEPENDENCY_CHECK_OBJECTS = 1;
// 对简单属性的依赖进行检查
public static final int DEPENDENCY_CHECK_SIMPLE = 2;
// 对所有属性的依赖进行检查
public static final int DEPENDENCY_CHECK_ALL = 3;
//若Bean未指定销毁方法,容器应该尝试推断Bean的销毁方法的名字
public static final String INFER_METHOD = "(inferred)";
// Bean的class对象或是类的全限定名
@Nullable
private volatile Object beanClass;
//bean的作用范围,对应bean属性scope是单例
@Nullable
private String scope = SCOPE_DEFAULT;
//是否是抽象,对应bean属性abstract 默认不为抽象类
private boolean abstractFlag = false;
//是否延迟加载,对应bean属性lazy-init
@Nullable
private Boolean lazyInit;
// 默认不进行自动装配
private int autowireMode = AUTOWIRE_NO;
// 默认不进行依赖检查
private int dependencyCheck = DEPENDENCY_CHECK_NONE;
//用来表示一个bean的实例化依靠另一个bean先实例化
//这里只会存放<bean/>标签的depends-on属性或是@DependsOn注解的值
@Nullable
private String[] dependsOn;
//autowire-candidate属性设置为false,这样容器在查找自动装配对象时,
//将不考虑该bean,即它不会被考虑作为其他bean自动装配的候选者,
//但是该bean本身还是可以使用自动装配来注入其他bean的
private boolean autowireCandidate = true;
//自动装配时出现多个bean候选者时,将作为首选者,对应bean属性primary
private boolean primary = false;
//用于记录Qualifier,对应子元素qualifier
private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<>();
@Nullable
private Supplier<?> instanceSupplier;
//允许访问非公开的构造器和方法,程序设置
private boolean nonPublicAccessAllowed = true;
//是否以一种宽松的模式解析构造函数,默认为true
private boolean lenientConstructorResolution = true;
//对应bean属性factory-bean 工厂类名
@Nullable
private String factoryBeanName;
//对应bean属性factory-method 工厂方法名
@Nullable
private String factoryMethodName;
//记录构造函数注入属性,对应bean属性constructor-arg
@Nullable
private ConstructorArgumentValues constructorArgumentValues;
//普通属性集合
@Nullable
private MutablePropertyValues propertyValues;
//方法重写的持有者,记录lookup-method、replaced-method元素
private MethodOverrides methodOverrides = new MethodOverrides();
//初始化方法,对应bean属性init-method
@Nullable
private String initMethodName;
//销毁方法,对应bean属性destroy-method
@Nullable
private String destroyMethodName;
//是否执行init-method,程序设置
private boolean enforceInitMethod = true;
//是否执行destroy-method,程序设置
private boolean enforceDestroyMethod = true;
//是否是用户定义的而不是应用程序本身定义的,创建AOP时候为true,程序设置
private boolean synthetic = false;
//定义这个bean的应用,APPLICATION:用户,INFRASTRUCTURE:完全内部使用,与用户无关
private int role = BeanDefinition.ROLE_APPLICATION;
//bean的描述信息
@Nullable
private String description;
//bean的资源
@Nullable
private Resource resource;