BeanFactory中的三级缓存
-
一级缓存
singletonObjects,直接缓存了完整的可使用的bean,当bean初始化后,会清除二三级缓存,把bean放入一级缓存。
-
二级缓存
earlySingletonObjects,提前曝光的bean,指已经实例化但是没有初始化的bean,用于解决循环依赖。比如A依赖B,B依赖A,在创建A的过程中,把A提前曝光,A注入依赖时,实例化B,B注入依赖时,可以直接从二级缓存中获取A,从而解决循环依赖的问题。
二级缓存的bean来自三级缓存,会从三级缓存中获取的bean放入二级缓存,并清除三级缓存。
-
三级缓存
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/2/3级缓存中获取Bean,存在bean则直接返回。
如果存在父beanFactory且本beanFactory不包含该bean的definition,则从父beanFactory中获取bean。
调用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法,如果生成了bean,则继续调用BeanPostProcessor.postProcessAfterInitialization执行初始化后的后置方法,然后直接返回bean。
实例化Bean(反射生成)
注册Bean到三级缓存
调用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation实例化后的后置处理方法
注入参数,根据xml配置的name和type自动装配。
InstantiationAwareBeanPostProcessor.postProcessPropertyValues处理参数,注解是在这里执行的依赖注入
执行BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
执行BeanPostProcessor.postProcessBeforeInitialization
执行初始化方法,先执行InitializingBean.afterPropertiesSet()方法,再执行@postConstruct方法
执行BeanPostProcessor.postProcessAfterInitialization()方法
注册销毁方法(@beforeDestroy)
对比初始化后的bean和原来是否是一个bean,如果是,则从缓存中获取bean作为最终的bean(防止被提前调用,生成了代理bean)
放入一级缓存,清除二、三级缓存