spring源码学习笔记1

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) --忽略BeanNameAwareBeanFactoryAwareBeanClassLoaderAware接口的自动装配;设置创建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) --实例化并注册所有 BeanPostProcessorBeanFactory   
     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的方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值