在spring源码中,会涉及到bean和beanDefinition这两个概念,接下来,说下什么是bean,什么是beanDefinition
class、beanDefinition、bean三者的关系
class是我们自己写的类,bean是spring经过自己的一系列处理之后。生成的,我们可以认为bean是spring容器中真正的成品,beanDefinition是对bean的一个描述信息,spring会根据beanDefinition去生成bean,所以三者的关系是:
spring首先将class转换为beanDefinition,然后再将beanDefinition转换为bean
我们通常说,spring可以通过自动扫描,完成bean的实例化,其实这里的自动扫描,是把class文件,通过扫描,转换为beanDefinition
beanDefinition的定义
我们可以看下beanDefinition的定义
可以看到,一个beanDefinition中,定义了N多个属性和方法,比如:是否是primary、是否是懒加载、dependOn属性、autowireMode自动注入属性等
所以,我们可以简单的认为,spring在扫描class的时候,会根据class文件中的注解等信息,给beanDefinition对象赋值,所以,beanDefinition是对一个类的描述
那spring在真正去初始化、实例化一个bean的时候,直接根据beanDefinition去初始化就可以,比如,在判断这个bean是根据类型注入,还是根据名字注入的时候,就直接判断autowireMode的属性值即可
spring根据beanDefinition进行初始化
org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons
@Override
public void preInstantiateSingletons() throws BeansException {
if (logger.isDebugEnabled()) {
logger.debug("Pre-instantiating singletons in " + this);
}
// Iterate over a copy to allow for init methods which in turn register new bean definitions.
// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
// 1.获取到所有的beanDefinitionName
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
// Trigger initialization of all non-lazy singleton beans...
// 2.依次遍历所有的beanDefinitionName,进行初始化
for (String beanName : beanNames