黃俊勇
摘要:該文對輕量級 Web 開發框架Spring進行了研究,對Spring的核心機制之一的IOC(Inversion of Control)進行了剖析 。首先從思想上的層面探討了Spring框架的核心思想IOC,接著從底層代碼上分析了Spring IOC的具體實現原理,包括Java工廠模式和Java反射機制在Spring IOC中是如何體現的。最后將Spring框架應用于臨沂木業員工管理系統中,同時臨沂木業員工管理系統集成Hibernate框架和Struts框架分別作為系統的持久層和表示層。通過采用Spring框架中的IOC,臨沂木業員工管理系統中的底層的輔助代碼和管理員模塊、員工的增刪改查模塊、部門模塊等業務邏輯代碼實現了很好的分離。正因為代碼的很好分離,使得系統在維護、修改、擴展和移植上有了很大的改善。
關鍵詞: Web;Spring;IOC
中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2018)03-0116-02
Abstract: In this paper, the lightweight Web development framework Spring is studied, and the IOC (Inversion of Control), one of the core mechanisms of Spring, is analyzed. First of all, this paper discusses the core idea of Spring framework from the ideological level, and then analyzes the specific implementation principles of Spring IOC from the underlying code, including how the Java factory model and the Java reflection mechanism are embodied in Spring IOC IOC. Finally, the Spring framework applied to Linyi wood staff management system, at the same time, Linyi wood staff management system integrated with Hibernate framework and the Struts framework as the system persistence layer Through the use of AOP in the Spring framework, Linyi wood staff management system in the bottom of the auxiliary code and administrator module, staff additions and deletions to check module, Department module and other business logic code to achieve a good separation. Because of the good separation of code, the system has been greatly improved in maintenance, modification, extension and transplantation.
Key words: Web;Spring;IOC
在現在的Web項目開發中,選擇一個合適的框架來實現項目,已經被越來越多的企業以及工程師重視了。一個設計優秀的框架可以顯著地提高代碼的重用率,對系統的運行效率也有很好的改善,對系統的可維護也有很大的提升。其中在眾多開發平臺中J2EE作為一款企業級開發平臺,被眾多網站公司以及企業應用于Web開發領域。J2EE運行的基礎環境就是Java的虛擬機平臺,它不僅繼承下了Java標準版中的諸多優點,例如集合框架、數據流的操作、數據庫的讀取等,而且還提供了與Web項目開發密切相關的技術,例如對xml的支持,對網頁的支持Servlet、Jsp以及EJB技術的支持。利用這一優勢,我們可以開發出適合企業的應用程序系統,通過對其的使用,可以極大地縮短開發時間投入使用。在JavaEE的長期開發和使用中,眾多工程師以及一些行業大牛,也逐步地發現了JavaEE中的一些缺陷和不足之處。為了應對這些缺陷和不足,在實際項目的開發中,新的開發模式、開發方法、開發框架以及各種框架的組合正在不斷地出現和更新。這其中絕大多數都是以開源的形式發布在互聯網上,讓越來越多的Java愛好者和技術大牛能投入其中,在現有的平臺上不斷的改進和提升JavaEE框架。在這過程之中就出現一款優秀的開源框架Spring。相對于JavaEE中EJB而言Spring是一款輕量級的框架,更加重要的,Spring是非侵入式的,基于Spring系統應用中代碼沒有過多的依賴。另一點其分層架構也是Spring被廣泛應用的原因,其不僅僅在限于服務器端的開發。
由于篇幅的原因,本文不會對Spring的所有核心技術都做研究,只是選取了Spring中的一個最基本也是最終要的一塊IOC(Inversion of Control),做了深入的剖析 。從思想上的高度探討了Spring框架的核心IOC容器,從底層代碼上分析了Spring IOC容器的具體實現原理,包括Spring IOC容器是如何應用Java工廠模式和Java反射機制來實現的。并將Spring、Hibernate、Struts框架應用于臨沂木業員工管理系統,分析通過采用Spring框架中的IOC,臨沂木業員工管理系統中的底層的輔助代碼和管理員模塊、員工的增刪改查模塊、部門模塊等業務邏輯代碼實現了很好的分離。代碼的分離,使得系統在維護、修改、擴展和移植上有了很大的改善。
1 Spring框架中的IOC
1.1 Spring框架的核心思想IOC
IOC(Inversion of Control)控制反轉,從大的方面準確的來講,IOC應該是程序設計中的一種思想,如何理解控制反轉呢?這種思想是慢慢積累演變過來,從程序設計開始之出,當我們要用到對象的時候,就直接在程序段中通過new來直接創建對象來使用,如果一個對象依賴于其他對象(好比組裝一臺電腦,你會依賴主板、硬盤、顯示器、鍵盤等等),這樣我們就會繼續在代碼中創建其他的對象,這樣使得各個類之間的耦合性很強。接著我們就會想著創建一個籃子,將所需要的對象提前放入其中,而數組、collection集合(如ArrayList、LinkedList、HashSet等)以及map集合正是我們所說的那個籃子。通過這種數組或集合來持有對象,我們將需要的對象提前放進去,需要的時候取出。雖然有了籃子,但是這個籃子里面的所有事物也需要我們之前在代碼中創建好,包括籃子本身也需要我們去創建出來。雖然有了改進但是還不夠理想。這樣我們就會想著,讓程序一開始就自帶了一個很大的籃子,將我們在系統運行后期所需要的所有對象都放入其中就行,更加重要的是,它不僅將所用的對象放入其中,而且對象之間的依賴關系也被其建立起來了。
1.2 Spring框架的IOC容器實現原理
Spring框架的核心思想之一IOC,而IOC的底層實現主要應用了兩個方面的技術,一個Java的工廠模式,另一個就是Java的反射機制。只有通過對這兩種技術上有所了解才能從底層更好地理解和掌握Spring IOC。
Java的工廠模式是一種經常使用的設計模式,也是Java23種設計模式之一,屬于創建模式的一種。我們一般是通過new關鍵詞來創建對象,通過new直接創建對象會帶來部分問題。例如,我們要創建一個“電腦”對象,這個對象本身又會依賴“鍵盤”、“鼠標”、“主板”等其他對象。如果創建的話這些依賴對象就需要全部創建。代碼就會顯得非常冗余,而且耦合度很高,不利于后期維護。與現實相對應的,我們就會想到用工廠直接為我們創建,我們需要的只是調用相應的工廠方法就可以了。Spring的IOC容器正是利用了這一思想。將工廠模式應用于其中,提高了代碼的靈活性。
有了工廠模式,還是有很大一個缺陷,就是如何去將其組織起來,而不是將其直接寫入代碼中。很容易我們就能想到Java的反射機制。基本上各種框架的實現很大一部分程度上都是依賴于Java的反射機制,通過反射機制,我們可以在程序運行期間,動態的獲取到所有類,所有對象的屬性或者方法,僅僅只是需要一個類名而已。有了這種技術,我們可以將要創建的對象名按照預先定義好的格式寫入xml文件中,再通過解析xml文件,這樣就可以從配置文件中讀取并創建對象以及對象之間的依賴關系。這樣寫的代碼僅僅只是所需要的類以及類的方法,還有就是簡單的業務邏輯。其他的部分,都通過配置文件配置,Spring IOC容器會為我們創建,工程師所做的工作就很少了。
2 基于Struts2+Spring+Hibernate框架的臨沂木業員工管理系統
2.1 Struts2+Spring+Hibernate框架的整合
1) 添加struts2的配置文件struts.xml到src目錄下,在struts.xml中添加幾個常用屬性:禁用動態方法訪問、配置成開發模式、配置拓展名為action、把主題配置成simple:
①
②
③
④
2) 在建立Web項目中找到web.xml文件,配置Struts2和Spring的參數:
①過濾器配置,添加StrutsPrepareAndExecuteFilter類的,攔截處配成*.action。
②注冊Spring的監聽器,ContextLoaderListener。
③啟動Spring,參數名contextConfigLocation、參數值classpath:applicationContext.xml。
3) 在將Hibernate整合進框架中,將原本在hibernate.cfg.xml中需要配置的信息,配置在spring的applicationContext.xml文件中:
①Mysql數據庫的驅動類driverClass。
②所要連接的Mysql連接數據庫的名稱user和數據庫的訪問密碼password。
③初始化時的連接數initialPoolSize。
④數據庫池中保留的最小連接數minPoolSize和最大連接數maxPoolSize。
⑤連接的最大空閑時間maxIdleTime。
⑥當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數acquireIncrement。
4) 最后就是配置Spring IOC容器中應該創建的系統與數據庫連接需要的工廠對象sessionFactory,在其屬性中將dataSource指向c3p0創建的dataSource源中,以及Spring的事務,分為三步分別為事務管理、事務通知和需要進行事務控制的類。
2.2 臨沂木業員工管理系統功能設計
臨沂木業員工管理系統主要分為兩個層面。表層也叫系統的前臺,主要負責臨沂木業普通員工的登錄、查看個人的信息(電話、地址等)、修改個人的部分信息、以及查看公司發布給所有用戶的信息、員工之間的論壇平臺、臨沂木業的內部員工投訴與建議平臺等。底層也叫系統的后臺,主要負責臨沂木業人事部門的管理員登錄,職能分為對普通員工的管理(查看所有員工的信息、還有信息的分類檢索、修改其登錄權限等),發布公司公告,以郵件形式有針對的向部分員工發送通知等。系統中的信息,通過創建表的方式來存儲于Mysql數據庫中,其中一共有5張表:管理員信息表(t_administrator),存放底層管理人員的信息;普通員工信息表(t_employee),存放表層普通員工的個人信息;公告信息表(t_announcement),用于存放公司公告信息的、時間、主題、內容等;權限分配表(t_authority),管理各個用戶的訪問權限只能由管理員分配給各個用戶;考勤表(t_attendance),存放用戶上班考勤信息,所有用戶都會分配的。
2.3 Spring IOC在臨沂木業員工管理系統中的體現
臨沂木業員工管理系統內用于存放數據的表,分別對應相關的Administrator、Employee、Announcement、Authority、Attendance的實體類,以及與其相對應的映射文件*.hbm.xml、數據訪問接口I*Dao、數據訪問接口實現*DaoImpl、業務邏輯接口I*Service、業務邏輯接口實現*ServiceImpl、控制跳轉實現*Action。其中所有類的創建都是通過Spring IOC容器來完成的,通過在其相應*.hbm.xml文件中配置bean屬性。以接口作為類變量名,具體的實現類通過Spring IOC來創建。降低了系統個層面的耦合度,系統的可維護性、可擴展性有了很大的提高。(其中*代表上文五個類名的通配,減少文字復述)
3 結束語
隨著互聯網的發展,Web 應用系統在不斷的完善,各種開發框架改進不斷的涌現。本文就其中一款較為優秀的框架Spring中的核心之一IOC進行了深入研究。在CentOS操作系統中,通過Eclipse集成開發環境、Tomcat服務器、Mysql數據庫開發并搭建了臨沂木業員工管理系統。通過采用Spring框架中的IOC,臨沂木業員工管理系統各層代碼實現了很好的分離,使得系統在維護、修改、擴展和移植上有了很大的改善。
參考文獻:
[1] Ho Clarence,Harrop Rob,Schaefer,Chris.Pro Spring[M]. Springer,2014:32-12.
[2] Matt Raible.Spring live,Sourcebeat[Z].2005:122-145.
[3] Nadir Gulzar.Practical JavaEE Application Architecture[M].McGraw-Hill,2009.
[4] DuBois Paul.MySQL Cookbook:Solutions for Database Developers and Administrators[Z].2014:1-203.
[5] 劉軍,戴金山.基于Spring MVC與iBATIS的輕量級Web應用研究[J].計算機應用,2006(4):840-842
[6] Bruce Eckel.Java編程思想[M].4版.北京:機械工業出版社,2008.
[7] 梅鋒.基于Spring實現J2EE企業級應用開發框架的研究與應用[D].武漢:武漢理工大學,2007.