翟高粵
摘 要:Spring是當(dāng)今流行的Java Web開發(fā)框架,它能解決大部分企業(yè)應(yīng)用開發(fā)的復(fù)雜性問(wèn)題。對(duì)于Java開發(fā)人員來(lái)說(shuō),掌握Spring框架的基本使用,已是入職Java軟件開發(fā)行業(yè)的必備技能之一。本文主要介紹Spring框架及其體系結(jié)構(gòu)的基本內(nèi)容及應(yīng)用,并通過(guò)一個(gè)實(shí)例說(shuō)明Spring框架的基本使用方法,理解Spring框架中IoC及DI的基本思想,對(duì)于Spring的入門學(xué)習(xí)有一定參考價(jià)值。
關(guān)鍵詞:Spring框架;Java EE;IoC;DI
一、引言
Spring 是在2003年興起的一個(gè)輕量級(jí)的Java應(yīng)用開發(fā)框架,它是為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的。Spring 的核心是控制反轉(zhuǎn)(IoC)和面向切面編程(AOP)。Spring 是可以在 Java SE/EE 中使用的輕量級(jí)開源框架。Spring通過(guò)使用基本的JavaBean來(lái)實(shí)現(xiàn)以前只能由EJB(企業(yè)JavaBean)完成的工作,一面世即迅速取代EJB臃腫、低效的開發(fā)模式,受到大批JAVA開發(fā)者的歡迎和支持。Spring致力于JavaEE應(yīng)用各層的解決方案,在表現(xiàn)層它提供了SpringMVC以及與Struts框架的整合功能;在業(yè)務(wù)邏輯層可以管理事務(wù)、記錄日志等;在持久層可以整合MyBatis、Hibernate、JdbcTemplate等技術(shù)。因此,Spring框架是企業(yè)應(yīng)用開發(fā)很好的框架之一。
二、相關(guān)理論
(一)Spring框架的特點(diǎn)
Spring具有簡(jiǎn)單、可測(cè)試和松耦合等特點(diǎn),Spring不僅可以用于服務(wù)器端的開發(fā),也可以用于任何Java軟件開發(fā)中。具體有如下特點(diǎn):
(1)非侵入式設(shè)計(jì)
(2)方便解耦,簡(jiǎn)化開發(fā)
(3)支持AOP
(4)支持聲明式事務(wù)處理
(5)方便程序測(cè)試
(6)方便集成各種框架
(7)降低Java EE API的使用難度
(二)Spring的體系結(jié)構(gòu)
Spring框架采用的分層設(shè)計(jì)架構(gòu),它根據(jù)一系列的功能分成20個(gè)模塊,具體如圖1所示。接下來(lái)對(duì)主要核心模塊進(jìn)行簡(jiǎn)單介紹。
(1)Core Container(核心容器)
Spring的核心容器是其他模塊建立的基礎(chǔ),它主要由Beans模塊、Core模塊、Context模塊、Context-support模塊和SpEL模塊構(gòu)成。Beans模塊提供了工廠模式的經(jīng)典實(shí)現(xiàn);Core模塊提供了Spring框架的基本組成部分,包括IcC和DI功能;Context模塊建立在Core和Beans模塊的基礎(chǔ)上,它是訪問(wèn)定義和配置的任何對(duì)象的媒介;Context-support提供了對(duì)第三方庫(kù)嵌入Spring應(yīng)用的集成支持;SpEL模塊提供了Spring Expression Language支持,是運(yùn)行時(shí)查詢和操作對(duì)象圖的強(qiáng)大的表達(dá)式語(yǔ)言。
(2)Data Access/Integration(數(shù)據(jù)訪問(wèn)/集成)
數(shù)據(jù)訪問(wèn)集成包括JDBC、ORM、OXM、JMS和Transactions模塊。JDBC模塊提供了一個(gè)JDBC的抽象層,大幅度地減少了在開發(fā)過(guò)程中對(duì)數(shù)據(jù)庫(kù)操作的編碼;ORM提供了對(duì)流行的對(duì)象關(guān)系映射API,包括JPA、JDO和Hibernate提供了集成層支持;OXM模塊提供了一個(gè)支持對(duì)象/OXM映射的抽象層實(shí)現(xiàn);JMS模塊指的是Java的消息傳遞服務(wù);Transactions事務(wù)模塊支持對(duì)實(shí)現(xiàn)特殊接口以及所有POJO類的編程和聲明式的事務(wù)管理。
(3)Web
Spring的Web層包括WebSocket、Servlet、Web和Portlet模塊。WebSocket模塊提了WebSocket和SockJS的實(shí)現(xiàn),以及對(duì)STOMP的支持;Servlet模塊提供了Spring的模型-視圖-控制器(MVC)和REST WebServices實(shí)現(xiàn)的Web應(yīng)用程序;Web模塊提供了基本的Web開發(fā)集成特性;Portlet模塊提供了在Portlet環(huán)境中使用MVC實(shí)現(xiàn),類似Servlet模塊的功能。
(4)其他模塊
Spring的其他模塊有AOP、Aspects、Instrumentation以及Test模塊。AOP模塊提供了面向切面編程實(shí)現(xiàn),允許定義方法攔截器和切入點(diǎn),將代碼按照功能進(jìn)行分離,以降低耦合性;Aspects模塊提供了與AspectsJ的集成功能,AspectsJ是一個(gè)功能強(qiáng)大且成熟的面向切面編程(AOP)框架;Instrumentation模塊提供了類工具的支持和類加載器的實(shí)現(xiàn),可以在特定的應(yīng)用服務(wù)器中使用;Messaging模塊提供了對(duì)消息傳遞體系結(jié)構(gòu)和協(xié)議的支持;Test模塊提供了對(duì)單元測(cè)試和集成測(cè)試的支持;
三、Spring核心容器
Spring框架的主要功能是通過(guò)其核心容器來(lái)實(shí)現(xiàn)的,Sping框架提供了兩種核心容器,分別為BeanFactory和ApplicationContext。
(一)BeanFactory容器
BeanFactory是由org.springframework.beans.factory.BeanFactory接口定義,是基礎(chǔ)類型的IoC容器,它提供了完整的IoC服務(wù)支持。BeanFactory是一個(gè)管理Bean的工廠,它主要負(fù)責(zé)初始化各種Bean,并調(diào)用它們的生命周期方法。
BeanFactory接口提供幾個(gè)實(shí)現(xiàn)類,其中最常用的是XmlBeanFactory,該類會(huì)通過(guò)XML配置文件中的定義來(lái)裝配Bean,語(yǔ)法實(shí)例如下:
BeanFactory beanFactory=new
XmlBeanFactory(new FileSystemResource(“c:/applicationContext.xml”);
(二)ApplicationContext
ApplicationContext是BeanFactory的子接口,也被稱為應(yīng)用上下文,是另一種Spring核心容器。它由org.springframework.context.ApplicationContext接口定義,不僅包含了BeanFactory的所有功能,還添加了對(duì)國(guó)際化、資源訪問(wèn)、事件傳播等方面的支持。創(chuàng)建ApplicationContext接口實(shí)例,通常采用兩種方法。
(1)通過(guò)ClassPathXmlApplicationContext創(chuàng)建
ClassPathXmlApplicationContext會(huì)從類路徑classPath中尋找指定的XML配置文件,找到并加載ApplicationContext的實(shí)例化工作,其使用語(yǔ)法如下:
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(String configLocation)
(2)通過(guò)FileSystemXmlApplicationContext會(huì)從指定的文件系統(tǒng)路徑中尋找指定的XML配置文件,找到并裝載完成ApplicationContext的實(shí)例化工作,其使用語(yǔ)法如下:
ApplicationContext applicationContext=new FileSystemXmlApplicationContext(String configLocation)
與ClassPathXmlApplicationContext有所不同的是,在讀取Spring的配置文件時(shí),F(xiàn)ileSystemXmlApplicationContext不再?gòu)念惵窂街凶x取配置文件,而是通過(guò)參數(shù)指定配置文件的位置,這種采用絕對(duì)路徑的方式,會(huì)導(dǎo)致程序的靈活性變差,所以這種方法一般不推薦使用。
(三)Spring編程實(shí)現(xiàn)
以上是對(duì)Spring的核心容器的介紹,接下來(lái)通過(guò)一個(gè)實(shí)例說(shuō)明Spring框架的編程步驟。
(1)在MyEclipse中,創(chuàng)建一個(gè)名為firstSpring的Web項(xiàng)目,將Spring的4個(gè)基礎(chǔ)包以及commons-logging的JAR包復(fù)制到lib目錄中,并發(fā)布到類路徑下,如圖2所示。
(2)在src目錄下,創(chuàng)建一個(gè)com.szjm.ioc包,并在包中創(chuàng)建接口UserDao,然后在接口中定義一個(gè)say()方法,代碼如下所示。
public interface UserDao{
public void say();}
(3)在com.szjm.ioc包下,創(chuàng)建UserDao接口的實(shí)現(xiàn)類UserDaoImpl,該類需要實(shí)現(xiàn)接口中的say()方法,并編寫一條輸出語(yǔ)句,代碼如下所示。
public class UserDaoImpl implements UserDao {
public void say() {
System.out.println("userDao say hello World !");
}
}
(4)在src目錄下,創(chuàng)建Spring的配置文件applicationContext.xml,并在配置文件中創(chuàng)建一個(gè)id為userDao的Bean,代碼如下所示。
<!-- 將指定類配置給Spring,讓Spring創(chuàng)建其對(duì)象的實(shí)例 -->
(5)在com.szjm.ioc包下,創(chuàng)建測(cè)試類TestIoC,并在類中編寫main() 方法,該main()方法需要初始化Spring容器,并加載配置文件,然后通過(guò)Spring容器獲取userDao實(shí)例,最后調(diào)用實(shí)例中的say()方法,代碼如下所示。
public class TestIoC {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
userDao.say();
}
}
執(zhí)行上述程序后,在控制臺(tái)的輸出結(jié)果如下所示。
四、結(jié)論
本文主要介紹Spring框架的基礎(chǔ)知識(shí)及一般應(yīng)用。首先講解了Spring框架的概念、作用、優(yōu)點(diǎn)、體系結(jié)構(gòu),然后介紹了Spring的兩種核心容器,接下來(lái)通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明如何使用Spring框架,并初步掌握Spring框架的使用方法。
參考文獻(xiàn):
[1]沃爾斯. Spring實(shí)戰(zhàn) [M]. 人民郵電出版社,2016.
[2]卡內(nèi)爾. Spring開發(fā)三劍客[M],人民郵電出版社, 2020.
[3] 陳恒等. Spring Boot從入門到實(shí)戰(zhàn)[M]. 清華大學(xué)出版社出版社,2020.