IOC容器
IOC底層原理
一、IOC的基本概念和原理
- 什麼是IOC
(1)控制反轉,把對象建立和對象之間的調用過程,交給Spring進行管理
(2)使用IOC目的:為了耦合度降低
(3)做入門案例就是IOC實作
- IOC底層原理
用到的技術:xml解析、工廠模式、反射
使用IOC的原因:原始方式建立和調用對象耦合度太高
舉例:類A、類B、類C三個類,A類和C類中建立了B類的對象,且通過該對象調用了B類中的方法調用了B類中的方法,B類的路徑或名字等等發生了變化,則需要修改A類和C類中的内容(牽一發動全身,一處改動,其他調用的地方也要跟着修改很不利于開發)本着程式開發高内聚低耦合的原則嘞我們就要努力降低代碼間的耦合度(隻能盡量降低,不可能完全解耦合)
(1)用工廠模式初步解耦合
總結:工廠模式解耦合隻是揭開了部分類與類之間的耦合,但是卻存在着工廠類和這些類的耦合,當工廠類路徑發生變化,還是要修改其他相關聯的類。
- 這裡建立5個類,類A、類B、類C、類D、工廠類E
- 類E有兩個靜态方法getC()和getE()調用後會分别建立一個C類的對象和D的對象并傳回
- 類A和B中調用getC()方法和getD()方法
- 當類C或類D改變時,隻用修改工廠類E就可以了
- 這的确解決了A、B類分别和C、D類之間的耦合但是C、D類和E類之間卻還存在着耦合
(2)IOC過程
- 建立xml配置檔案,配置建立的對象
- 三個類service類和dao類,建立工廠類
class UserFactory{
public static UserDao getDao(){
//1.xml解析bean中的class路徑
String classValue = 解析出的類路徑;
// 2.通過反射建立對象
Class clazz = Class.forName(classValue);//擷取類結構
return (UserDao)clazz.newInstance();//通過類結構執行個體化類對象
}
}
總結:IOC的解耦方式即通過工廠模式解開類與類之間的耦合,再通過配置xml檔案,xml解析和反射解開類與工廠之間的耦合,類發生改變時隻需要修改配置檔案即可,進一步降低了耦合度
IOC接口(BeanFactory)
- IOC的思想基于IOC容器完成,IOC容器的底層就是對象工廠
- Spring提供IOC容器的兩種實作方式:(兩個接口)
BeanFactory:
IOC容器的基本實作,是Spring 内部 的使用接口,不建議開發人員進行使用
特點:加載配置檔案時不會建立對象,在擷取對象的時候才會去建立對象
ApplicationContext:
BeanFactory接口的子接口,提供更多更強大的功能,這個就是給開發人員使用的接口了
特點:和BeanFactory完全相反,即在加載配置檔案時就會将配置檔案中的對象建立(這兩者的差別就和懶漢單例模式和餓漢單例模式的差別差不多吧,懶漢是要的時候建立,餓漢是在類加載的時候建立)
- 兩者對比(哪個好一點),看情況而定,一般web項目要部署到tomcat上,在tomcar啟動時将這些對象建立好,和在tomcat啟動後運作時需要的時候再建立對象相比,個人覺得是ApplicationContext接口好一點,
- 總結:要啟動快一點就用BeanFactory,要運作絲滑一點就用ApplicationContext不過現在的電腦都差不多啦,隻要不是太大的項目兩者随便
- ApplicationContext接口的實作類(按f4或ctrl+H調出類結構)
- 在上一篇文章中提到過的兩個類
- FileSystemXmlApplicationContext
- ClassPathXmlApplicationContext
差別:
FileSystemXmlApplicationContext 是根據系統檔案路徑來查找檔案的如:c:\user\data這種用于電腦的路徑
ClassPathXmlApplicationContext 這個是根據類路徑來查找檔案的,即src下的類路徑
- 打開BeanFactory的結構圖,這裡還有一個子接口,可以包含一些相關的擴充功能