目錄
三層架構
Controller
Service
Dao
?編輯
調用過程
面向接口編程
分層解耦
耦合
內聚
軟件設計原則
控制反轉
依賴注入
Bean對象
如何將類產生的對象交給IOC容器管理?
容器怎樣才能提供依賴的bean對象呢?
三層架構
Controller
控制層,也稱為控制器,主要職責是接收前端發來的請求,并且給前端響應數據
Service
業務邏輯層,負責具體的業務邏輯處理
Dao
數據訪問層,也叫持久層,負責數據訪問操作,包括數據的增刪改查
在mybatis中通常叫mapper
調用過程
瀏覽器發起請求先訪問Controller,而Controller層僅僅負責接收請求響應數據,并不負責邏輯處理,所以Controller要去調用Service,Service再來進行邏輯處理,而Service進行邏輯處理的前提是要拿到數據,所以Service再來調用Dao,Dao再來訪問文件,從文件中加載數據,Dao將數據加載回來后訪問Service,Service再來對數據進行邏輯處理,邏輯處理完畢后再將處理后的數據返回給Controller,Controller再將數據響應給前端
面向接口編程
將來項目會升級,項目中的數據肯定不會在文件中存儲,他是要存儲在專門的數據庫中這個時候又要定義一個dao,這個dao要從數據庫中加載數據,也有可能項目中的數據來源于網絡,這個時候要再定義一個dao,那么dao層就會有多種實現,多種實現加載的數據來源是不一樣的。那在項目中為了提高程序的拓展性,便于項目的統一維護管理,我們通常會為dao的多種實現提供一個統一的接口,在接口中定義一個統一的規范,允許的不同的實現,各個實現來實現統一的接口,也就是面向接口編程
提供一個統一的接口
分層解耦
耦合
衡量軟件中各個層/各個模塊的依賴關聯程度
業務層Service代碼發生變化,Contrller層代碼也要發生跟著變化,我們成為Controller和Service之間耦合了
內聚
軟件中各個功能模塊內部的功能聯系
比如 userSerivice是用戶信息操作的Service,這個類中只會去處理用戶相關的邏輯,非用戶相關的邏輯不會定義在這個類中,我們就說這個類的內聚程度較高,即高內聚
軟件設計原則
高內聚低耦合
“高內聚”就是模塊內部的聯系越緊密越好,“低耦合”是指模塊與模塊||層與層之間要降低耦合,最好能做到解除耦合,也就是所謂的“解耦”
解耦后service層的代碼變動是不會影響controller層的,dao層代碼變動也不會影響service層,
想要解耦就不能去new對象,因為service層的代碼發生變化,new對象代碼部分也要跟著變化,那么層與層之間又耦合起來了
不去new對象,聲明了這個對象默認值就是null,調用userService的list方法就會報空指針異常
如何做到不new對象解除耦合又能不報空指針異常呢?
提供一個容器用來存儲一些對象,比如想用UserService這個實現類產生的對象,那就可以將這個實現類產生的對象交給容器來管理,在容器中就會產生UserService這個實現類產生的對象,也就是這個一號對象
Controller運行時需要用到UserService這個類型的對象,那么就可以從容器中查找這個對象,讓容器給應用程序來提供這個類型的對象,
由此看來,即使Service類的類名發生了變化,或者切換了一個實現類,對于Controller層來說是不用動任何的代碼,這樣就完成了層與層的解耦
控制反轉
簡稱IOC||Spring容器
對象的創建控制權由程序自身new轉移到外部容器,這種思想成為控制反轉
依賴注入
簡稱DI
容器為應用程序提供運行時所依賴的資源,這個過程稱為依賴注入
Bean對象
在IOC容器中創建管理的對象,稱之為Bean對象
如何將類產生的對象交給IOC容器管理?
在實現類上面加上注釋@Conponent,代表將這個類交給IOC容器管理,由IOC容器來負責這個對象的創建
如果是mybatis統一的接口xxxMapper,則在接口上方加上注解@Mapper,代表程序運行時,會自動為這個接口創建一個實現類對象(代理對象),并自動將該實現類對象存入IOC容器中,成為IOC容器的bean對象
容器怎樣才能提供依賴的bean對象呢?
在成員變量上加上注解@Autowired,會自動找到容器中UserDao類型的對象,并賦值給這個成員變量,這樣就完成了依賴注入的過程。