摘 要:Spring是當今流行的企業級應用開發框架,它能解決大部分企業應用開發的復雜性問題。對于Java開發人員來說,掌握Spring框架的基本使用,已是入職Java軟件開發行業的必備技能之一。本文主要介紹Spring框架及其體系結構的基本內容及應用,并通過實例說明Spring框架中IoC和AOP的基本使用方法。
關鍵詞:Spring框架;IoC;AOP;企業級應用開發
Spring的出現是為了更好服務于企業級應用開發。企業級應用是指為商業組織、大型企業創建并部署的解決方案及應用。這些大型企業級應用的結構復雜,涉及的外部資源眾多,事務密集、數據規模大、用戶數量多,有較強的安全性考慮和較高的性能要求。企業級應用絕不可能是一個個的獨立系統。在企業中,一般都會部署多個交互的應用,同時這些應用又有可能與其他企業的相關應用連接,從而構成一個結構復雜的、跨越網絡的分布式企業應用集群。此外,作為企業級應用,不但要有強大的功能,還要能夠滿足未來業務需求的發展變化,易于擴展和維護。而傳統的Java EE在解決企業級應用問題時技術煩瑣,屬于“重量級”架構體系,使它的開發效率、開發難度和實際性能都令人失望。而Spring作為一個新興的“輕量級”企業級應用開發框架,致力于Java EE應用的各種解決方案,而不僅僅專注于某一層的方案。可以說,Spring是企業應用開發的最優選擇,它貫穿表現層、業務層和持久層,可以和現有的各種技術框架無縫結合。
一、Spring整體架構簡介
Spring是一個輕量級框架,它大大簡化了Java企業級開發,提供強大、穩定功能的同時并沒有帶來額外的負擔。它主要有兩個作用:一是讓現有技術更易于使用;二是養成良好的編程習慣。作為一個全面的解決方案,Spring堅持一個原則:簡單易用,無需重新實現。例如,對持久化和ORM,Spring只是對現有的JDBC、MyBatis、Hibernate等技術提供支持,使之更易用,而不是重新實現。
Spring框架由大約20個功能模塊組成。這些模塊被分為六個部分,分別是Core Container,Data Access/Integration,Web、AOP、Instrumentation及Test,如圖1所示。Spring Core是框架的最基礎部分,提供了IoC特性。Spring Context為企業級開發提供了便利的集成工具。Spring AOP是基于Spring Core的符合規范的面向切面編程的實現。Spring JDBC提供了JDBC的抽象層,簡化了JDBC編碼,同時使代碼更健壯。Spring ORM對市面上流行的ORM框架提供了支持。Spring Web為Spring在Web應用程序中的使用提供了支持。Spring IoC和AOP是Spring技術中的核心,下面介紹這兩種核心技術的情況。
二、Spring IoC核心技術介紹
控制反轉(Inversion of IoC)也稱之為依賴注入(Dependency Injection,DI),是面向對象編程中的一種設計理念,用來降低程序代碼之間的耦合度。依賴一般指通過局部變量、方法參數、返回值等建立的對于其他對象的調用關系。例如,在A類的方法中,實例化了B類的對象并調用其方法來完成特定的功能,也就是A類依賴于B類。幾乎所有的應用都由兩個或更多的類通過合作來實現完整的功能。類與類之間的依賴關系增加了程序開發的復雜程度。例如,常見的業務層調用數據訪問層以實現持久化操作代碼如下。
public interface UserDao{? ? ? ? ? ? ?//用戶DAO接口,定義了所需的持久化方法
public void save(User user);}
public class UserDaoImpl implements UserDao{// 用戶DAO實現類,實現User類的持久化操作
public void save(User user){
System.out.println(“保存用戶信息到數據庫”);}
public class UserServiceImpl implements UserService{//實例化所依賴的UserDao對象
private UserDao dao=new UserDaoImpl();
public void addNewUser(User user){
dao.save(user);}
如上三段代碼中,UserServiceImpl對UserDaoImpl存在依賴關系。這樣的代碼很常見,但是存在一個嚴重的問題,就是UserServiceImpl和UserDaoImpl高度耦合,如果因為需求變化需要替換UserDao的實現類,將導致UserServiceImpl中的代碼隨之發生修改。程序將不具備優良的可擴展性和可維護性,甚至在開發中難以測試。下面我們使用IoC編程方式進行改進。
public class UserDaoFactory{//增加DAO工廠類,負責用戶DAO實例的創建工作
public static UserDao getInstance(){
......
}}
pubic class UserService Implements UserService{//通過工廠類獲取所依賴的用戶DAO對象
private UserDao dao=UserDaoFactory.getInstance();
public void addNewUser(User user){
dao.save(user);}}
上例中的用戶DAO工廠類UserDaoFactory體現了“控制反轉”的思想:UserServiceImpl不再依靠自身的代碼去獲得所依賴的具體DAO對象,而是把這一工作轉交給了“第三方”UserDaoFactory,從而避免了和具體UserDao實現類之間的耦合。由此可見,在如何獲取所依賴的對象上,“控制權”發生了“反轉”,即從UserServiceImpl轉移到了UserDaoFactory,這就是“控制反轉”IoC思想。
三、Spring AOP核心技術介紹
面向切面編程(Aspect Oriented Programming,AOP)是軟件編程思想發展到一定階段的產物,是對面向對象編程的有益補充。AOP一般適用于具有橫切邏輯的場合,如訪問控制、事務管理、性能檢測等。在軟件系統中,日志、異常處理、事務控制等都是一個健壯的業務系統所必需的。但為了保證系統的健壯性,就要在眾多的業務方法中反復編寫功能類似的代碼,使得原本就很復雜的業務處理代碼變得更加復雜。業務功能的開發者還需要關注這些額外的代碼是否處理正確,是否有遺漏。如果需要修改日志信息的格式或者安全驗證的規則,或者再增加新的輔助功能,都會導致業務代碼頻繁而大量的修改。對于軟件開發人員來說,他們最希望的是無須編寫顯式的調用,在需要的時候,系統能夠“自動”調用所需的功能,這正是AOP存在的必要。也就是說,面向切面編程就是在不改變原有程序的基礎上通過代理對象為代碼段增加新的功能,對其進行增強處理,這樣在調用原有代碼的時候會自動執行增加的新的功能。下面通過一個例子說明AOP編程的方法和步驟。
四、AOP實現思路及關鍵代碼
(1)在項目中添加Spring AOP相關的jar文件
(2)編寫前置增強和后置增強功能代碼
(3)編寫Spring配置文件,對業務方法進行增強處理
(4)編寫測試代碼,獲取帶有增強處理的業務對象并運行結果,部分關鍵代碼如下所示。
public class UserServiceLogger{//定義包含增強方法的JavaBean
public void before(JoinPoint jp){
.... //此處為前置增強代碼
}
public void afterReturning(JoinPoint jp){
.... //此處為后置增強代碼
}}
UserServiceLogger類中定義了before()和afterReturning()兩個方法。其中before方法作為前置增強使用,即將該方法添加到目標方法之前執行;把afterReturning方法作為后置增強使用,即將該方法添加到目標方法正常返回之后執行。同時為了能夠在增強方法中獲得當前連接點的信息,以便實施相關的判斷和處理,在增強方法中聲明一個JoinPoint類型的參數,Spring會自動注入實例。通過實例的getTarget方法得到被代理的目標對象,通過getSignature方法返回被代理的目標方法,再通過getArgs方法返回傳遞給目標方法的參數數組。對于后置增強的afterReturning方法,還可以定義一個參數用于接收目標方法的返回值。部分AOP切入點配置代碼如下所示。
五、結論
本文主要介紹Spring框架核心技術的基礎知識及一般應用。首先講解了Spring框架的概念、作用、優點、體系結構,然后介紹了Spring的兩種核心技術IoC和AOP,接下來通過實例來說明如何使用Spring框架的兩種核心技術,并初步掌握Spring框架兩種核心技術的編程方法。
參考文獻:
[1]沃爾斯. Spring實戰 [M]. 人民郵電出版社,2016.
[2]卡內爾. Spring開發三劍客[M],人民郵電出版社, 2020.
[3] 陳恒等. Spring Boot從入門到實戰[M]. 清華大學出版社,2020.
作者簡介:翟高粵(1975—),男,漢族,廣西欽州人,碩士,研究方向:軟件理論、人工智能。