javascript
Spring IOC实现原理
一、IOC 容器:最主要是完成了完成對(duì)象的創(chuàng)建和依賴的管理注入等等。
??所謂控制反轉(zhuǎn),就是把原先我們代碼里面需要實(shí)現(xiàn)的對(duì)象創(chuàng)建、依賴的代碼,反轉(zhuǎn)給容器來幫忙實(shí)現(xiàn)。那么必然的我們需要?jiǎng)?chuàng)建一個(gè)容器,同時(shí)需要一種描述來讓容器知道需要?jiǎng)?chuàng)建的對(duì)象與對(duì)象的關(guān)系。這個(gè)描述最具體表現(xiàn)就是我們可配置的文件。?
? ?對(duì)象和對(duì)象關(guān)系怎么表示?
? ?可以用?xml?,?properties?文件等語義化配置文件表示。?
? ?描述對(duì)象關(guān)系的文件存放在哪里?
? ?可能是 classpath , filesystem ,或者是 URL 網(wǎng)絡(luò)資源, servletContext 等。
? ?有了配置文件,還需要對(duì)配置文件解析。
? ?不同的配置文件對(duì)對(duì)象的描述不一樣,如標(biāo)準(zhǔn)的,自定義聲明式的,如何統(tǒng)一??在內(nèi)部需要有一個(gè)統(tǒng)一的關(guān)于對(duì)象的定義,所有外部的描述都必須轉(zhuǎn)化成統(tǒng)一的描述定義。
? ?如何對(duì)不同的配置文件進(jìn)行解析?需要對(duì)不同的配置文件語法,采用不同的解析器。
二、IOC體系結(jié)構(gòu)
(1)?BeanFactory
??Spring?Bean的創(chuàng)建是典型的工廠模式,這一系列的Bean工廠,也即IOC容器為開發(fā)者管理對(duì)象間的依賴關(guān)系提供了很多便利和基礎(chǔ)服務(wù),在Spring中有許多的IOC容器的實(shí)現(xiàn)供用戶選擇和使用,其相互關(guān)系如下:?
? ?其中BeanFactory作為最頂層的一個(gè)接口類,它定義了IOC容器的基本功能規(guī)范,BeanFactory?有三個(gè)子類:ListableBeanFactory、HierarchicalBeanFactory?和AutowireCapableBeanFactory。但是從上圖中我們可以發(fā)現(xiàn)最終的默認(rèn)實(shí)現(xiàn)類是?DefaultListableBeanFactory,他實(shí)現(xiàn)了所有的接口。那為何要定義這么多層次的接口呢?查閱這些接口的源碼和說明發(fā)現(xiàn),每個(gè)接口都有他使用的場(chǎng)合,它主要是為了區(qū)分在?Spring?內(nèi)部在操作過程中對(duì)象的傳遞和轉(zhuǎn)化過程中,對(duì)對(duì)象的數(shù)據(jù)訪問所做的限制。例如?ListableBeanFactory?接口表示這些?Bean?是可列表的。HierarchicalBeanFactory?表示的是這些?Bean?是有繼承關(guān)系的,也就是每個(gè)Bean?有可能有父?Bean。AutowireCapableBeanFactory?接口定義?Bean?的自動(dòng)裝配規(guī)則。這四個(gè)接口共同定義了?Bean?的集合、Bean?之間的關(guān)系、以及?Bean?行為.最基本的IOC容器接口BeanFactory。
public?interface?BeanFactory?{????
? ? ??
? ? ? //對(duì)FactoryBean的轉(zhuǎn)義定義,因?yàn)槿绻褂胋ean的名字檢索FactoryBean得到的對(duì)象是工廠生成的對(duì)象,????
? ? ? //如果需要得到工廠本身,需要轉(zhuǎn)義???????????
? ? ? String?FACTORY_BEAN_PREFIX?=?"&";?
? ? ? ? ?
? ? ? //根據(jù)bean的名字,獲取在IOC容器中得到bean實(shí)例????
? ? ? Object?getBean(String?name)?throws?BeansException;????
? ??
? ? ?//根據(jù)bean的名字和Class類型來得到bean實(shí)例,增加了類型安全驗(yàn)證機(jī)制。????
? ? ? Object?getBean(String?name,?Class?requiredType)?throws?BeansException;????
? ? ?
? ? ?//提供對(duì)bean的檢索,看看是否在IOC容器有這個(gè)名字的bean????
? ? ? boolean?containsBean(String?name);????
? ? ?
? ? ?//根據(jù)bean名字得到bean實(shí)例,并同時(shí)判斷這個(gè)bean是不是單例????
? ? ?boolean?isSingleton(String?name)?throws?NoSuchBeanDefinitionException;????
? ? ?
? ? ?//得到bean實(shí)例的Class類型????
? ? ?Class?getType(String?name)?throws?NoSuchBeanDefinitionException;????
? ? ?
? ? ?//得到bean的別名,如果根據(jù)別名檢索,那么其原名也會(huì)被檢索出來????
? ? String[]?getAliases(String?name);????
? ? ?
?}
http://www.cnblogs.com/ITtangtang/p/3978349.html
轉(zhuǎn)載于:https://blog.51cto.com/13010541/1935188
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Spring IOC实现原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 20145209 实验三 《敏捷开发与X
- 下一篇: jquery通过数值改变球大小