深入瞭解IOC |
概念
IOC:控制反轉
所謂控制,就是指資源的獲取方式
主動式:
ExamServlet{
ExamService es=new ExamService ();
Paper paper=new Paper();// 複雜對象的創建是非常龐大的工程
}
被動式:
ExamServlet{
Paper paper;
public void test(){
paper.checkout();
}
}
容器是什麼
容器:管理所有的組件(有功能的類);
假設ExamServlet受容器管理,ExamService 也受容器管理;容器可以自動的探查出哪些組件(類)需要用到另一些組件(類);容器幫我們創建ExamService 對象,並把ExamService 對象賦值
容器:主動的new資源變爲被動的接受資源;容器可以理解爲是婚介所;找對象的人由主動獲取變爲被動接受;
DI(Dependency injection)依賴注入
容器能知道哪個組件類運行的時候,需要另外一個類(組件);容器通過反射的形式,將容器中準備好的ExamService 對象,注入(利用反射給屬性賦值)到BookServlet中;
主要是容器管理的組件,都能使用容器提供的強大功能
通過各種方式給容器中註冊對象,所以前是自己new對象嗎,現在所有的對象交給容器創建,給容器中註冊組件,就像是國家負責分配對象一樣,不用自己找對象了,你需要什麼樣的對象,國家給你安排,依賴注入就是給你找的對象指定指標,指定多高多胖等等的屬性
使用spring框架
使用框架一般都分爲三步:1.引入依賴;2.修改配置文件;3.測試
導包
4個核心jar包
日誌包
寫配置
集合了spring的ioc容器管理的所有組件(類)
創建一個Spring Bean Configuration
實例測試
新建Person類
配置文件
測試類
分析
1.對象是什麼時候創建的?
在類的構造方法中打印什麼時候調用,在類的getter、setter方法打印什麼時候調用,然後再容器啓動後打印啓動完成,就可以知道對象是什麼時候創建的
可以看出在容器啓動完成之前,對象已經創建了,並且已經賦值,而且容器是通過類的構造函數創建對象,通過類的getter,setter方法賦值。
2.創建對象是否是單例模式
從容器中取出id爲01的創建好的對象
判斷是否相等
結果是相等
說明容器只創建了一次對象,是單例模式
3.獲取不存在的對象,就會報異常
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘person03’ available
執行結果
4.只要容器一啓動所有的對象都創建了
可以看出構造函數調用了兩次,一共有兩個對象都創建出來了
小結
- 結論
- 給容器中創建一個組件,我們根據id拿到對象
- 容器創建之後對象就創建了
- 只要容器一啓動所有的對象都創建了
- 同一組件在ioc中是單實例的,容器啓動完成之前都已經創建準備好的
- 如果獲取容器中沒有的組件,獲取組件就會報異常
- ioc容器在創建這個組件對象的時候,property會利用setter方法爲javaBean屬性進行賦值
- src 源碼包開始的路徑,稱爲類路徑的開始
- 所有源碼包裏面的都會被合併放在類路徑裏面