spring ioc源码阅读总结

springioc指的是spring的控制反转,在没用spring前,传统的构造对象一般都是new一个对象,这样的new出来的对象就与类耦合度很高,并且创建销毁都得通过自己写代码去实现。而spring的ioc,他是将对象都注册到ioc容器中,对象的创建和销毁都有spring控制,你只需要告诉spring你是什么,你需要什么,spring就会在合适的时机把你需要的对象创建好给你,这样耦合度就会大大降低。
比如首先通过xml文件启动一个spring容器,new classpathxmlApplicationContext(),关键是从 AbstractApplicationContext的refresh()方法开始,这个方法里首先会调用preparerefresh()方法检查xml文件有效性,然后调用obtainFreshBeanFactory()方法,这个方法主要有三点,第一是创建了一个defaultlistablebeanfactory,也就是beanfactory第二是设置了beanfactory的两个属性,一个是是否允许bean循环引用第二个是是否允许bean覆盖,第三点是调用的loadbeandefinition()方法加载了bean定义,在这个方法里调用了doloaddocument的readdocument()方法以及XmlBeanDefinitionReader()方法解析了xml文件,至此obtainFreshBeanFactory()方法执行结束。
然后会执行prepareBeanFactory(beanFactory)方法,这个方法里首先会执行 postProcessBeanFactory()方法,提供了子类的扩展点,可以在这里进行对子类扩展的操作,然后会执行invokeBeanFactoryPostProcessors(beanFactory);调用 BeanFactoryPostProcessor 各个实现类的 postProcessBeanFactory(factory) 方法,接着会执行 registerBeanPostProcessors(beanFactory)方法, 注册 BeanPostProcessor 的实现类,这个实现类主要有两个方法,postProcessBeforeInitialization 和 postProcessAfterInitialization,也就是在bean初始化前后执行的操作。然后回执行国际化,创建监听器等方法,然后会执行 finishBeanFactoryInitialization(beanFactory)方法,这是一个重点,这个方法会初始化所有非懒加载的单例bean。这个方法里会调用getbean()方法,这个方法通过三步来初始化bean对象,第一是调用createbeaninstance()初始化一个bean对象,然后调用populatebean方法()给bean赋属性,第三是调用initializeBean()方法初始化bean对象,这个方法里会先检查是否实现了 BeanNameAware、BeanClassLoaderAware 或 BeanFactoryAware 接口,如果实现了则回调相关方法,然后会执行刚才注册的postProcessBeforeInitialization 方法,进行bean初始化前置处理,然后调用初始化方法,然后调用 postProcessAfterInitialization,进行bean的初始化后置处理,这样就完整的初始化了一个bean对象。

posted @ 2020-07-01 21:55  北城cheng  阅读(130)  评论(0编辑  收藏  举报