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