javascript
用项目案例彻底理解Spring IOC容器
本篇介紹Spring IOC容器,通過具體的實例詳細地講解IOC概念,徹底理解Spring反轉控制的思想。通過本篇的學習,可以達成如下目標。
● 運用工廠模式設計程序
● 理解JavaBean和POJO對象
● 理解控制反轉思想
● 理解IOC容器
?
1、一個簡單的項目需求
在一個鄉村小學校,一天只上三節課,有三名老師和一個校長。張老師負責教學生語文,王老師教學生數學,李老師教音樂,校長負責安排三位老師每天的上課時間,并提前通知各位老師上課時間,通知方式包括郵件、電話,后續可能會有更多方式。
現在需要編寫一個Java程序實現校長安排老師老師上課時間,并通知到老師,要考慮程序的可擴展性。
?
2、用工廠模式設計程序
項目中通知老師上課的方式包括郵件、電話,后續可能還有所擴展。雖然通知方式不同,但通知功能是一致的,適合用工廠模式來設計通知功能,后續增加通知方式時,再增加一個通知實現類和修改工廠類代碼就可以了,無需修改其它實現類的代碼。
工廠模式主要用于對功能相似的類進行抽象,抽象出的功能通過接口方式由實現類來實現,然后由工廠類裝配不同的實現類,實現一個工廠生產不同產品的功能。
?
圖1 Notice工廠模式
代碼實現步驟:
(1)定義通知類接口
?
(2)定義EmailNotice類,實現NoticeInterface接口
?
(3)定義PhoneNotice類,實現NoticeInterface接口
?
(4)定義NoticeFactory類,負責裝配不同實現方式的通知類
?
?
3、項目的實體類——老師
項目的唯一實體類是老師類,實體類也是POJO類(簡單的Java對象),實體類僅有屬性以及獲取和設置屬性的get和set方法,沒有事務處理方法,這是和Javabean不同的地方。
哪些類適合作為POJO類呢?項目中用于描述事物本身以及需要數據傳遞和序列化的類。例如,項目中的數據庫表、實體對象、序列化對象等。在本項目案例中,老師類屬于實體對象類。
定義老師類的代碼如下:
?
4、項目的業務類——校長
業務類也稱為BO(業務對象),用于處理項目中的業務邏輯。業務邏輯主要用于項目涉及的各類業務操作。例如,在本項目案例中,校長需要安排上課時間,并發送上課時間給老師。在業務對象中,需要組織和協調實體類、組件類、DAO(數據訪問對象)完成整個業務邏輯的處理操作。其中,組件類是JavaBean,是用于處理具體事務的類。例如,在本項目案例中,PhoneNotice、EmailNotice類就是組件類,用于處理發送通知事務。
定義校長類的代碼如下:
?
5、項目技術架構存在的問題
?
圖2 項目技術架構圖
項目技術架構主要由javaBean組件、業務邏輯處理、POJO(實體)、前端四部分組成。JavaBean組件實現通知發送,應用工廠模式便于組件擴展。業務邏輯處理部分調用NoticeFactory創建通知組件和Teacher類,并將Teacher類實例和消息注入到組件,最后調用組件發送消息。
從技術架構圖可以看出,NoticeFactory(組件工廠)負責通知組件的創建,Principal(業務類)調用NoticeFactory獲取組件,并將Teacher類實例和消息注入到組件。Principal是主要控制類,控制了組件的創建和組件屬性的注入。
Principal類對組件的較強控制,對程序的擴展性和易維護性顯然是不利的。例如,當程序需要增加微信通知方式,且老師都希望用微信通知時,麻煩就來了,需要修改大量程序代碼。再如,老師的上課時間可能每周或每天都有變化,把時間安排寫在程序代碼中顯然是不妥的,應該寫在程序外面,由外面對通知組件的屬性進行注入。
要解決上面的問題,就需要弱化Principal類對組件的控制權,將組件的創建和屬性的注入(圖2紅色點劃線指示的功能)交給第三方托管,這個第三方就是Spring框架的IOC容器,控制反轉就是將Principal類對組件的控制權移交給IOC容器。
6、Spring IOC容器的控制反轉
Spring IOC容器是框架的核心,IOC是控制反轉的意思,可以用來降低程序代碼之間的耦合度。把強耦合的代碼依賴從代碼中移出去,放到統一的XML配置文件中,將程序對組件的主要控制權交給IOC,由IOC統一加載和管理。例如,可以把本案例中的JavaBean組件的創建、實體類的創建、以及JavaBean組件的屬性注入等代碼從Principal類移出,放入到Spring的XML配置文件中。這樣就實現了Principal類與JavaBean組件的代碼解耦,也解決了項目案例技術架構所存在的問題。
Spring配置文件代碼如下:
?
定義新的業務類,用于從IOC上下文環境中讀取組件和POJO實例,代碼如下:
?
課程小結
Spring IOC容器的核心是把程序業務代碼與事物(組件、POJO類)代碼進行分離,程序有關事物的創建、屬性和依賴對象的注入、以及生命周期交由容器進行加載和管理。業務代碼只需從容器中獲取組件或POJO實例對象即可,無需再考慮組件之間、組件與POJO之間的依賴關系以及屬性的注入。
總結
以上是生活随笔為你收集整理的用项目案例彻底理解Spring IOC容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】Python随机数ran
- 下一篇: 对称加密之分组加密【四】