SpringIOC加载流程
IOC是在Spring启动后初始化环境和上下文对象完成后开始执行的
首先是创建BeanFactory,并将它的引用交给ApplicationContext,解析xml中配置的Bean,将他们封装成BeanDefinition对象,并放入HashMap中
BeanDefinition对象中封装了IOC初始化需要用到的所有信息,例如全限定名,是否懒加载,注入的属性,作用域等等。
准备BeanFactory对象,为他设置类加载器,以及设置一些Spring环境中的特殊类,在注入时直接可以返回,防止重复创建;手动添加了几个BeanFactoryPostProcessor后置处理器(注册监听器、Aware接口的回调)
BeanFactory对象创建完成,开始执行后置处理器,除了Spring中定义好的以外,可能还会有用户或者框架定义的BeanFactoryPostProcessor,如MyBatis专门用于注册Mapper接口的处理器。
至此Bean的初始化完成(还未实例化),注册BeanPostProcessor,执行Bean初始化完成的前置处理,这里也是可以自己拓展的点。
这里还会有一些国际化、事件监听器的注册处理不细说了。
接着进入重头戏,Bean的实例化。
进行实例化前会有一系列的判断,懒加载、抽象类、AOP的切面类等等这些不会被实例化。
处理FactoryBean,它和普通Bean不同的是,它的实现类是一个工厂类,Spring会调用定义的工厂类实例化对象,例如MyBatis的Mapper就是自定义了工厂类动态代理的生成对象。
处理普通Bean,根据BeanDefinition对象中的全限定类名反射创建,然后注入它的属性,引用对象则为递归创建(循环引用问题,Spring都是按照先实例化后注入属性,实例化后会放入缓存中,如果遇到循环引用则会从缓存当中取出来,防止出现死循环)
Bean实例化全部完成后,调用BeanPostProcessor中的后置处理方法,这里可拓展。
发布Bean实例化完成事件,观察者模式的应用,监听器再做其他操作。