
spring如何創(chuàng)建bean
同樣先把java類通過classloader加載到class,Spring容器一啟動(dòng)就會(huì)去掃描這些class,將class掃描變成BeanDefinition(用來描述我們的class的),再將BeanDefinition放到一個(gè)map中如圖綠色框,map中就描述了某個(gè)class的信息,spring再通過循環(huán)遍歷這個(gè)map,把map中所有的BeanDefinition拿出來,再通過preinstantiatesingletons方法把BeanDefinition變成一個(gè)bean,這個(gè)bean會(huì)放到spring IOC容器中,最后通過getbean方法拿到bean對(duì)象。
所以spring new一個(gè)對(duì)象跟class沒有關(guān)系,跟BeanDefinitionMap有關(guān)系
注意可以人為干預(yù)Spring創(chuàng)建bean的過程
可以通過其中的一個(gè)拓展點(diǎn)BeanFactoryPostProcessor這個(gè)接口去插手BeanDefinitionMap人為把這個(gè)map改了
BeanFactoryPostProcessor只能修改不能往BeanDefinitionMap添加BeanDefinition
問題:為什么需要?jiǎng)討B(tài)注冊(cè)bean
大部分時(shí)候,靜態(tài)的配置信息即可滿足系統(tǒng)需求。但是某些場景下,我們需要根據(jù)靜態(tài)配置中的信息動(dòng)態(tài)生成bean,此時(shí)就需要?jiǎng)討B(tài)注冊(cè)bean的功能。
如:用戶定義一個(gè)如下的接口,而接口的實(shí)現(xiàn)則由框架生成,不需要用戶自行編寫,此時(shí)實(shí)現(xiàn)類就需要?jiǎng)討B(tài)注冊(cè)到容器中。
問題:一個(gè)接口如何調(diào)用一個(gè)方法:動(dòng)態(tài)代理或者factorybean
借助ImportBeanDefinitionRegistrar接口實(shí)現(xiàn)bean的動(dòng)態(tài)注入

