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. 放入一级缓存,清除二、三级缓存

你可能感兴趣的:(Spring IOC知识点)