介紹下Java Spring的核心接口,容器中Bean的實(shí)例化
Spring的核心接口
ApplicationContext接口
繼承了BeanFactory并且提供了加載資源文件的方法
ApplicationContext其實(shí)就是一個(gè)容器,ApplicationContext的實(shí)例其實(shí)就是容器對(duì)象,這個(gè)容器對(duì)象在實(shí)例化過(guò)程中其實(shí)就是容器初始化的過(guò)程
下面這幾個(gè)都是ApplicationContext接口的實(shí)現(xiàn)類
ClasspathXmlApplicationContext
加載Classpath下的xml格式的配置文件,初始化這樣的實(shí)例
FileSystemXmlApplicationContext
加載文件路徑下的xml文件
AnnotationConfigApplicationContext
注解配置
SpringMVC: WebApplicationContext
這個(gè)還沒(méi)有引入對(duì)應(yīng)的依賴所以暫時(shí)看不到
BeanFactory接口
生產(chǎn)bean,生產(chǎn)全部bean,容器。ApplicationContext接口繼承了BeanFactory接口
也就是說(shuō)BeanFactory接口實(shí)際上提供了Bean獲得組件 管理組件方法
Spring容器中Bean的實(shí)例化
Spring的核心就是控制反轉(zhuǎn),它要控制實(shí)例的生成(實(shí)例化)
實(shí)例化主要有以下幾種方式
構(gòu)造方法
無(wú)參構(gòu)造方法
默認(rèn)使用的就是無(wú)參構(gòu)造方法,最常用的
先貼出來(lái)xml文件,其中如果有參構(gòu)造方法把無(wú)參構(gòu)造方法覆蓋掉的話,就需要constructor-arg標(biāo)簽來(lái)告知,其中的name標(biāo)簽就是對(duì)應(yīng)的有參構(gòu)造方法的參數(shù)名,而無(wú)參構(gòu)造方法想要給屬性做賦值就只需要property子標(biāo)簽即可
有參構(gòu)造方法
測(cè)試后我們發(fā)現(xiàn)
工廠
靜態(tài)工廠
工廠里的生產(chǎn)方法是靜態(tài)方法
注冊(cè)組件
實(shí)例工廠
工廠里的生產(chǎn)方法不是靜態(tài)方法
組件注冊(cè)
我們需要額外注冊(cè)組件,并且要告訴其工廠是誰(shuí) 工廠要使用的方法是什么
測(cè)試類
這里我們發(fā)現(xiàn)雖然都是User 但他們不是同一個(gè)組件
注意:如果直接去取的話或發(fā)生異常
此時(shí)加個(gè)id再去取出就可以了,
方法二:可以使用Map方式,按照類型去取出User組件
靜態(tài)工廠和實(shí)例工廠在整合一些已有的工具類的時(shí)候,工具類有一些靜態(tài)方法返回某一些實(shí)例而后面要去使用這些實(shí)例,就需要使用靜態(tài)工廠方法注冊(cè)組件
FactoryBean→使用工廠方法
FactoryBean實(shí)際上是個(gè)接口,我們看下它的代碼
getObject()就是生產(chǎn)方法,其實(shí)就是返回一個(gè)實(shí)例
使用UserFactoryBean的set方法去給User做一個(gè)賦值
注冊(cè)組件
我們的目的是想要通過(guò)FactoryBean獲取到一個(gè)User類型的組件
通過(guò)FactoryBean注冊(cè)的組件類型:和getObject方法的返回值是相關(guān)的,簡(jiǎn)單來(lái)講就是Spring再檢查注冊(cè)組件的時(shí)候會(huì)檢查組件有沒(méi)有實(shí)現(xiàn)FactoryBean接口如果有實(shí)現(xiàn)就會(huì)去找到里面的getObject方法,把getObject返回的實(shí)例注冊(cè)為容器中的組件
面試題:
BeanFactory和FactoryBean區(qū)別
都可以注冊(cè)組件
BeanFactory:生產(chǎn)的是全部組件
FactoryBean:注冊(cè)的特定類型的組件
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章

Springboot指定掃描路徑的實(shí)現(xiàn)示例

java正則表達(dá)式判斷強(qiáng)密碼和隨機(jī)生成強(qiáng)密碼代碼示例

SpringBoot?Redis清除所有的key的實(shí)現(xiàn)方法

Java實(shí)現(xiàn)數(shù)據(jù)更新和事件通知的觀察者模式

java面試常見(jiàn)問(wèn)題---ConcurrentHashMap

IntelliJ IDEA之高效代碼插件RainBow Brackets詳解

Java將Word文檔轉(zhuǎn)換為PDF文件的幾種常用方法總結(jié)