如何在Spring所有Bean創建完后做擴展?
哪里才算所有的bean創建完了。
首先是所有的配置bean會注冊成BeanDefinition
然后根據BeanDefinition進行循環調用一個一個的getBean進行生產。
循環完所有的BeanDefiniton,通過BeanFactory的getBean方法生成所有的Bean
這個循環結束之后,所有的Bean就創建完了。
源碼:
new ApplicationContext()里面有refresh()體現IOC容器加載。
refresh方法里面會調用finishBeanFactoryInitialization方法。
在finishBeanFactoryInitialization方法里面循環所有的BeanDefinition,一個一個getBean創建 。這個循環結束之后,那么所有的bean就創建完了。
【注意】:
擴展點1:
等所有的bean創建完之后,會再次循環所有的bean,看有哪些bean是否實現了SmartInitializingSingleton接口,如果實現了這個接口,就會繼續調用afterSingletonsInstantiated方法。
擴展點2:
所有的bean創建完之后都會調用的擴展接口。
refresh方法里面會調用finishBeanFactoryInitialization方法的后面就是調用finishRefresh方法。
在finishRefresh方法里面會調用ContextRefreshedEvent事件,發布一個ContextRefreshed事件。
創建一個監聽器來監聽這個事件,就可以完成這個擴展。