spring源码学习笔记
最近在研究spring framework IOC 容器启动的源码,spring版本为5.3.0-M1,本文从一个简单的示例着手跟踪spring 启动流程,以及获取bean的过程。
MainTest类:spring启动到加载bean的执行过程:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
HelloService helloService = (HelloService) applicationContext.getBean("helloService");
System.out.println("=====######========"+helloService.say());
代码执行步骤:
1、main:12, MainTest (com.sp.learn)
2、<init>:85, ClassPathXmlApplicationContext (org.springframework.context.support)
3、<init>:145, ClassPathXmlApplicationContext (org.springframework.context.support) --设置应用上下文的配置位置
4、refresh:541, AbstractApplicationContext (org.springframework.context.support) --进行上下文刷新
4-1、prepareRefresh:537,AbstractApplicationContext (org.springframework.context.support) --准备上下文环境以进行刷新、设置启动日期、活动标志以及执行任何属性源的初始化。
4-2、obtainFreshBeanFactory:669, AbstractApplicationContext (org.springframework.context.support) --开始创建DefaultListableBeanFactory
refreshBeanFactory:127, AbstractRefreshableApplicationContext (org.springframework.context.support) --执行上下文底层 bean 工厂的实际刷新,关闭先前的 bean 工厂(如果有)并为上下文生命周期的下一阶段初始化一个新的 bean 工厂。
createBeanFactory:197, AbstractRefreshableApplicationContext (org.springframework.context.support) --创建DefaultListableBeanFactory
<init>:201, DefaultListableBeanFactory (org.springframework.beans.factory.support)
<init>:201, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
<init>:185, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) --忽略BeanNameAware、BeanFactoryAware、BeanClassLoaderAware接口的自动装配;设置创建Bean实例的策略SimpleInstantiationStrategy
beanFactory.setSerializationId(getId()) --设置唯一ID用于序列化
customizeBeanFactory:129,AbstractRefreshableApplicationContext (org.springframework.context.support) --自定义设置BeanFactory的一些属性,是否允许循环依赖、是否允许Bean的定义信息被覆盖等
loadBeanDefinitions:83, AbstractXmlApplicationContext (org.springframework.context.support) --通过 XmlBeanDefinitionReader 加载 bean 定义。
4-3、prepareBeanFactory:545, AbstractApplicationContext (org.springframework.context.support) --对BeanFactory进行一些预操作
4-4、postProcessBeanFactory:550,AbstractApplicationContext (org.springframework.context.support) --允许这里对BeanFactory做一些处理,默认空实现
4-5、invokeBeanFactoryPostProcessors:554, AbstractApplicationContext (org.springframework.context.support) --执行BeanFactory的后置处理器
4-6、registerBeanPostProcessors:558, AbstractApplicationContext (org.springframework.context.support) --实例化并注册所有 BeanPostProcessor 到BeanFactory
4-7、initMessageSource:562, AbstractApplicationContext (org.springframework.context.support) --国际化
4-8、initApplicationEventMulticaster:566, AbstractApplicationContext (org.springframework.context.support) --初始化事件多播器 如果spring容器中有没有EventMulticaster,没有的话使用默认的SimpleApplicationEventMulticaster
4-9、onRefresh:861, AbstractApplicationContext (org.springframework.context.support) --初始化一些特殊的bean ,交给子类实现,默认空实现
4-10、registerListeners:869, AbstractApplicationContext (org.springframework.context.support) --注册ApplicationListener到事件传播器中
4-11、finishBeanFactoryInitialization:898, AbstractApplicationContext (org.springframework.context.support) --实例化所有剩余的(非延迟初始化)单例
4-12、finishRefresh:935, AbstractApplicationContext (org.springframework.context.support) --容器构建结束,发布相应的事件。
4-13、resetCommonCaches:973, AbstractApplicationContext (org.springframework.context.support) --清除缓存
5、getBean:1160, AbstractApplicationContext (org.springframework.context.support)
getBean:204, AbstractBeanFactory (org.springframework.beans.factory.support)
doGetBean:248, AbstractBeanFactory (org.springframework.beans.factory.support)
transformedBeanName:1237, AbstractBeanFactory (org.springframework.beans.factory.support) --返回实际的bean名称,去除工厂引用前缀&(如果有,也去除重复的工厂前缀(如果找到))。
getSingleton:168, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) --先尝试从1级缓存singletonObjects中查找,找到直接返回,否则,判断是否正在创建中singletonsCurrentlyInCreation.contains(BeanName),否则返回null,如果是,则加锁保证原子性,从2级缓存earlySingletonObjects中查找,如果找到直接返回,否则判断是否允许循环依赖,否则返回Null,允许则从3级缓存singletonFactories获取ObjectFactory<?> ,不为空则执行getObject()方法,并把返回的Object放到2级缓存earlySingletonObjects中,最后把3级缓存的移除掉。
getObjectForBeanInstance:1288, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) --获取 Bean 实例的对象
6、获取bean,执行Bean的方法。