spring的bean容器到底是什么呢?
---從表面上看就是一個類+一個xml文檔,就是ApplicatonContext這個類和spring的配置文件beans.xml。我們經常就是寫下面這樣的語句
//實例化spring容器 ApplicationContext ctx = new FileSystemXmlApplicationContext("beans.xml"); //這里使用文件系統來加載xml文件,這並不是最理想的方法,我們應該使用類路徑進行去加載我們的配置文件xml,因為不同的機子,他的文件系統是不一樣的。 //獲取類 某某類 xx = ctx.getBean("某某id");
---實質上他使用了工廠模式和默認的單例模式幫我們進行實例化我們在xml配置的bean,將bean對象的創建,銷毀等生命周期在一個地方集中的進行,我們要用某個bean的話,我們就去這個地方進行獲取。
.如下面的<bean的元素。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="personDao" class="cn.can.dao.PersonDao"/> <bean ...> ..... </beans>
很明顯,我們將我們的類進行配置在xml文檔中,然后進行解析這個xml文檔,在解析的過程實例。在這里我們應該考慮到
1)spring是如何創建bean的,他的生命周期是?
加載xml,進行解析xml。使用發射機制和描述bean的類進行配合進行實例化這些bean.所以bean的默認構造器是很必須的。
這就使用工廠進行生成類,在這個工廠中,只要告訴我要類是有那種接口特性就能得到這個類了。
2)是用靜態工廠方法進行實例,還是其他的呢?是使用單例模式還是原型進行創建這里的bean呢,這個bean生命周期是?什么時候進行實例呢?。
當scope="singleton"和lazy-init='default'時候,容器加載的時候就被實例化了,但這里的lazy-init='true'這個時候實例化將被延遲了。
當scope='prototype'的時候,就是延遲實例化了。