一、bean的声明
- xml声明bean。
- @bean、@Component、@Service等等等基于注解的形式。
- ……
二、全流程梳理
以xml的方式声明bean为例,这里
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) context.getBean("user");
2.1 进入refresh方法
ClassPathXmlApplicationContext构造器中调用了另一个构造器:
该构造器中执行了refresh()方法
2.2 获取BeanFactory对象
首先我们要知道,Bean对象和BeanDefinition对象都是是通过BeanFactory创建。
所以,只有在获取BeanFactory之后才能获取到BeanDefinition。
- 下面获取beanfactory对象:
- 点进去,到了AbstractApplicationContext类的obtainFreshBeanFactory方法。
- 再点,AbstractRefreshableApplicationContext类的refreshBeanFactory方法。这里我们看到,在创建BeanFatory对象的同时创建了BeanDefinition对象。
2.3 创建BeanDefinition对象
2.3.1 AbstractXmlApplicationContext类
- 点进去loadBeanDefinitions方法,因为我们是以xml创建bean举例,所以这里会跳转到xml相关的实现类——AbstractXmlApplicationContext类,对应的loadBeanDefinitions方法。beanFactory就是XmlBeanDefinitionReader里面的registry,所以后面我们看到的registry就是beanFactory对象。
- 再点!125行获取配置文件路径。再点进去127行。AbstractXmlApplicationContext类。
2.3.2 AbstractBeanDefinitionReader类
- 下面一路点,下面4个图片的方法都在AbstractBeanDefinitionReader类。
2.3.3 XmlBeanDefinitionReader类
- 跳到实现类XmlBeanDefinitionReader
这里388行读取配置文件
389行才是注册BeanDefinitions
2.3.4 DefaultBeanDefinitionDocumentReader类
- DefaultBeanDefinitionDocumentReader类下的方法
138是解析xml之前做的事情,140是解析完之后做的事情。
- 这里通过解析xml文件遍历里面的bean标签创建beanDefinition
- 根据当前的元素标签,选择不同的解析方式。比如:import、alias、beans
2.3.5 BeanDefinitionParserDelegate类
- 类BeanDefinitionParserDelegate的方法
- 到这里,终于到主要的逻辑了。
- 548获取全限定类名,556创建BeanDefinition对象。
- BeanDefinitionParserDelegate类的方法
2.3.6 BeanDefinitionReaderUtils类
- 类BeanDefinitionReaderUtils的方法
总结
在容器创建时会先去创建一个beanFactory,然后使用XmlBeanDefinitionReader去读取xml配置文件,把里面的标签进行解析,然后创建BeanDefinition对象来存放bean标签中各个属性的值。所以BeanDefinition相当于就是保存了bean的定义信息的对象。
通过BeanDefinition里面的信息,就可以使用反射来创建bean对象。
2.4 BeanDefinition的存储
- 我们回到【2.3.4】节的DefaultBeanDefinitionDocumentReader的processBeanDefinition()方法中。在这里创建beanDefinition对象并存储在bdHolder中。
bdHolder是beanDefinition,而getReaderContext().getRegistry()是BeanFactory。
这里getBeanFactory和getRegistry返回的都是同样的:
debug也可以看出来
DefaultListableBeanFactory是BeanDefinitionRegistry的实现类。 - 327行这行代码的作用就是将beanDefintion对象注册到beanFactory中。
2.4.1 BeanDefinitionReaderUtils类
- 进入
2.4.2 DefaultListableBeanFactory类
- 进入registerBeanDefinition方法。
最终会运行到这里: