sprint ioc容器
在spring中,最基本的IOC容器接口就是BeanFactory,这个接口为具体的IOC容器实现提供了基本功能的规定。
1 |
|
BeanFactory里只对IOC容器的基本行为做了定义,对bean的如何定义及其加载过程并不关心。就像我们只关心我们得到什么产品的对象,至于工厂是怎么产生这些对象的,这个接口并不关心。
Spring IOC初始化过程
spring ioc初始化顺序主要是:读取xml资源、解析xml资源、注册到BeanFactory。完成初始化过程后,bean就在BeanFactory中等待调用。下面以ClassPathXmlApplicationContext入口类为例,详细说明初始化过程。
从传入配置到创建BeanFactory
首先入口处在ClassPathXmlApplicationContext类中
1 |
|
refresh方法在父类AbstractApplicationContext中,它具体的实现是这样的
1 |
|
接下来去obtainFreshBeanFactory方法中看看进行了什么操作
1 |
|
然后再去AbstractRefreshableApplicationContext类中看看refreshBeanFactory方法做了哪些操作
1 |
|
bean的加载及注册
loadBeanDefinitions方法在AbstractRefreshableApplicationContext中是个抽象方法,其实现在子类AbstractXmlApplicationContext类中
1 | protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { |
loadBeanDefinitions方法主体在XmlBeanDefinitionReader中
1 |
|
其中DefaultBeanDefinitionDocumentReader类承担了大部分xml标签解析的功能,解析的细节就不具体展开了。
1 |
|
registerBeanDefinition方法
1 |
|
registerBeanDefinition方法主体位于DefaultListableBeanFactory中
1 |
|
截止到这里,已经初始化了Bean容器,
初始化singleton bean
在上面提到的refersh方法中,有一个finishBeanFactoryInitialization方法,完成初始化所有单例的bean
1 |
|
继续到DefaultListableBeanFactory类中看看preInstantiateSingletons方法
1 |
|
getBean(String name)方法完成普通bean的初始化,该方法是从BeanFactory中获取bean的方法,但是初始化过程也封装在这个方法中
1 | @Override |
接下来是创建bean,我们来到了AbstractAutowrieCapableBeanFactory类,这个类和Autowire注解有关
1 |
|
继续看doCreateBean方法
1 |
|
到这里为止,完成了整个初始化流程。上面的过程里,最重要的三个函数是创建bean实例的方法createBeanInstance,一个是依赖注入的populateBean方法,还有回调方法initializeBean。
1 |
|
进入无参构造函数方法看看
1 |
|
1 |
|
属性注入
1 |
|
处理回调
1 |
|