Spring IOC知识点

BeanFactory中的三级缓存

  1. 一级缓存

    singletonObjects,直接缓存了完整的可使用的bean,当bean初始化后,会清除二三级缓存,把bean放入一级缓存。

  2. 二级缓存

    earlySingletonObjects,提前曝光的bean,指已经实例化但是没有初始化的bean,用于解决循环依赖。比如A依赖B,B依赖A,在创建A的过程中,把A提前曝光,A注入依赖时,实例化B,B注入依赖时,可以直接从二级缓存中获取A,从而解决循环依赖的问题。

    二级缓存的bean来自三级缓存,会从三级缓存中获取的bean放入二级缓存,并清除三级缓存。

  3. 三级缓存

    singletonFactories,bean实例化后,初始化之前,会把当前bean放入一个匿名ObjectFactory。当从缓存中获取Bean时,如果穿透到三级缓存,会调用SmartInstantiationAwareBeanPostProcessor接口的getEarlyBeanReference方法,返回提前曝光的包装/代理bean(典型用处,AOP)。bean初始化后,判断初始化返回的bean是否是之前的bean,如果是,则会以缓存中获取的bean作为完整的可使用的bean。AOP时,从三级缓存中获取的是已经实例化Bean的代理,bean初始化后,调用SmartInstantiationAwareBeanPostProcessor的postProcessAfterInitialization方法不会对bean再次代理,而是从缓存中获取已经被代理的bean。

Spring getBean步骤

​ 创建singleton bean步骤:

  1. 从1/2/3级缓存中获取Bean,存在bean则直接返回。

  2. 如果存在父beanFactory且本beanFactory不包含该bean的definition,则从父beanFactory中获取bean。

  3. 调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法,如果生成了bean,则继续调用BeanPostProcessor.postProcessAfterInitialization执行初始化后的后置方法,然后直接返回bean。

  4. 实例化Bean(反射生成)

  5. 注册Bean到三级缓存

  6. 调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation实例化后的后置处理方法

  7. 注入参数,根据xml配置的name和type自动装配。

  8. InstantiationAwareBeanPostProcessor.postProcessPropertyValues处理参数,注解是在这里执行的依赖注入

  9. 执行BeanNameAware、BeanClassLoaderAware、BeanFactoryAware

  10. 执行BeanPostProcessor.postProcessBeforeInitialization

  11. 执行初始化方法,先执行InitializingBean.afterPropertiesSet()方法,再执行@postConstruct方法

  12. 执行BeanPostProcessor.postProcessAfterInitialization()方法

  13. 注册销毁方法(@beforeDestroy)

  14. 对比初始化后的bean和原来是否是一个bean,如果是,则从缓存中获取bean作为最终的bean(防止被提前调用,生成了代理bean)

  15. 放入一级缓存,清除二、三级缓存

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 只有光头才能变强 回顾前面: 给女朋友讲解什么是代理模式 包装模式就是这么简单啦 单例模式你会几种写法? 工...
    Java3y阅读 2,294评论 1 60
  • Spring容器高层视图 Spring 启动时读取应用程序提供的Bean配置信息,并在Spring容器中生成一份相...
    Theriseof阅读 2,859评论 1 24
  • 2.1 我们的理念是:让别人为你服务 IoC是随着近年来轻量级容器(Lightweight Container)的...
    好好学习Sun阅读 2,750评论 0 11
  • 1- IOC的概念 IOC:也即控制反转,DI即依赖注入,控制反转IOC和依赖注入DI其实就是同个概念的两个不同...
    zhanglbjames阅读 3,047评论 1 3
  • 01 被称为“小诺贝尔文学奖”的英国库彻国际文学奖,2016年的获奖者是首位来自亚洲的作家,韩国作家--韩江,获奖...
    热爱一生阅读 4,803评论 29 37