BeanFactory中的三級緩存
-
一級緩存
singletonObjects笆包,直接緩存了完整的可使用的bean目派,當bean初始化后,會清除二三級緩存喜每,把bean放入一級緩存。
-
二級緩存
earlySingletonObjects雳攘,提前曝光的bean带兜,指已經實例化但是沒有初始化的bean,用于解決循環(huán)依賴吨灭。比如A依賴B刚照,B依賴A,在創(chuàng)建A的過程中喧兄,把A提前曝光无畔,A注入依賴時啊楚,實例化B,B注入依賴時浑彰,可以直接從二級緩存中獲取A恭理,從而解決循環(huán)依賴的問題。
二級緩存的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步驟
? 創(chuàng)建singleton bean步驟:
從1/2/3級緩存中獲取Bean命咐,存在bean則直接返回篡九。
如果存在父beanFactory且本beanFactory不包含該bean的definition,則從父beanFactory中獲取bean醋奠。
調用InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法榛臼,如果生成了bean,則繼續(xù)調用BeanPostProcessor.postProcessAfterInitialization執(zhí)行初始化后的后置方法窜司,然后直接返回bean沛善。
實例化Bean(反射生成)
注冊Bean到三級緩存
調用InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation實例化后的后置處理方法
注入參數(shù),根據xml配置的name和type自動裝配塞祈。
InstantiationAwareBeanPostProcessor.postProcessPropertyValues處理參數(shù)金刁,注解是在這里執(zhí)行的依賴注入
執(zhí)行BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
執(zhí)行BeanPostProcessor.postProcessBeforeInitialization
執(zhí)行初始化方法尤蛮,先執(zhí)行InitializingBean.afterPropertiesSet()方法媳友,再執(zhí)行@postConstruct方法
執(zhí)行BeanPostProcessor.postProcessAfterInitialization()方法
注冊銷毀方法(@beforeDestroy)
對比初始化后的bean和原來是否是一個bean,如果是产捞,則從緩存中獲取bean作為最終的bean(防止被提前調用醇锚,生成了代理bean)
放入一級緩存,清除二轧葛、三級緩存