BeanFactory和FactoryBean
區(qū)別:BeanFactory是個(gè)Factory,也就是IOC容器或?qū)ο蠊S,F(xiàn)actoryBean是個(gè)Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)來(lái)進(jìn)行管理的蘸炸。但對(duì)FactoryBean而言,這個(gè)Bean不是簡(jiǎn)單的Bean妇拯,而是一個(gè)能生產(chǎn)或者修飾對(duì)象生成的工廠Bean,它的實(shí)現(xiàn)與設(shè)計(jì)模式中的工廠模式和修飾器模式類似 幻馁。
spring的生命周期:
instantiate bean對(duì)象實(shí)例化
populate properties?封裝屬性
如果Bean實(shí)現(xiàn)BeanNameAware執(zhí)行setBeanName
如果Bean實(shí)現(xiàn)BeanFactoryAwar或ApplicationContextAwar設(shè)置工廠setBeanFactory或上下文對(duì)象setApplicationContext
如果存在類實(shí)現(xiàn)BeanPostProcessor(后處理Bean),執(zhí)行postProcessBeforeInitialization
如果Bean實(shí)現(xiàn)InitializingBean執(zhí)行afterPropertiesSet
調(diào)用自定義的init-method方法
如果存在類實(shí)現(xiàn)BeanPostProcessor(處理Bean),執(zhí)行postProcessAfterInitialization
執(zhí)行業(yè)務(wù)處理
如果Bean實(shí)現(xiàn)DisposableBean執(zhí)行destroy
調(diào)用自定義的destroy-method
第一步就是對(duì)實(shí)例化bean,調(diào)用構(gòu)造函數(shù)來(lái)創(chuàng)建實(shí)例越锈,第二步是根據(jù)配置仗嗦,進(jìn)行相應(yīng)屬性的設(shè)置,依賴注入就是在這一步完成的甘凭。
第三步和第四步是讓spring去了解咱們的spring容器稀拐,第五步和第八步可以針對(duì)指定的Bean進(jìn)行功能增強(qiáng),這時(shí)一般是采用的動(dòng)態(tài)代理丹弱,(兩種動(dòng)態(tài)代理方式:jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理)德撬。第六步和第十步是通過(guò)實(shí)現(xiàn)指定的接口來(lái)完成init(初始化)和destory(銷毀)操作。但是我們?cè)谕ǔG闆r下不會(huì)使用這兩步躲胳,因?yàn)槲覀兛梢酝ㄟ^(guò)第七步和第十一步蜓洪,在配置文件中設(shè)置相應(yīng)的初始化和銷毀方法。
比如:
總結(jié):
對(duì)于springbean的生命周期坯苹,我們需要關(guān)注的主要有兩個(gè)方法:
1.增強(qiáng)bean的功能可以使用后處理Bean隆檀,BeanPostProcessor
2.如果需要初始化或銷毀操作,我們可以使用init-method方法和destory-method方法粹湃。
同時(shí)還需要注意一點(diǎn):destory-method方法是只針對(duì)于scope=singleton的時(shí)候才有效果恐仑!
僅個(gè)人學(xué)習(xí)整理,轉(zhuǎn)載https://www.cnblogs.com/wgl-gdyuan/p/9911653.html