BeanDefinition的定位。對(duì)IOC容器來(lái)說(shuō),它為管理POJO之間的以來(lái)關(guān)系提供了幫助,但也要依據(jù)Spring的定義規(guī)則提供Bean定義信息。我們可以使用各種形式的Bean定義信息,其中比較熟悉和常用的是使用xml文件格式。在Bean定義方面,Spring為用戶提供了很大的靈活性。在初始化Ioc的過(guò)程中,首先需要定位到這些有效的bean定義信息,這里Spring使用Resource接口來(lái)統(tǒng)一這些Bean定義信息,而這個(gè)定位由ResourceLoader來(lái)完成。
容器的初始化。在使用上下文時(shí),需要對(duì)它進(jìn)行一個(gè)初始化的過(guò)程,完成初始化之后,這個(gè)容器才可以使用。容器的初始化入口是refresh方法(根據(jù)具體使用的applicationContext不同)。refresh調(diào)用BeanDefinition來(lái)完成bean信息的載入和注冊(cè),但是不完成以來(lái)注入,除非配置了lazy-init的屬性。否則依賴注入在第一次getBean的時(shí)候調(diào)用注冊(cè)。
這里涉及到一個(gè)循環(huán)引用(Circular Reference)的問(wèn)題。
如果A依賴B,并且B依賴A.但兩個(gè)類的方法沒(méi)有互相調(diào)用。 * 如果使用的是Constructor依賴,那么就會(huì)拋出Is there an unresolvable circular reference?
的錯(cuò)誤 * 如果使用是setter方法注入依賴,那么依賴注入是分開(kāi)的,當(dāng)需要的時(shí)候才會(huì)注入。就不會(huì)拋出來(lái)循環(huán)引用的異常。 * 如果是A和B之中的方法還有互相調(diào)用,雖然不會(huì)拋出來(lái)循環(huán)引用的異常,但是會(huì)拋出棧溢出的異常。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注