無(wú)標(biāo)題文章

spring官方文檔:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/
一震束、Spring框架概述
Spring框架是一個(gè)輕量級(jí)的解決方案盯蝴,可以一站式地構(gòu)建企業(yè)級(jí)應(yīng)用郁副。Spring是模塊化的,所以可以只使用其中需要的部分〔昀铮可以在任何web框架上使用控制反轉(zhuǎn)(IoC)蜕便,也可以只使用Hibernate集成代碼JDBC抽象層。它支持聲明式事務(wù)管理谷异、通過RMI或web服務(wù)實(shí)現(xiàn)遠(yuǎn)程訪問,并可以使用多種方式持久化數(shù)據(jù)锦聊。它提供了功能全面的MVC框架歹嘹,可以透明地集成AOP到軟件中。
Spring被設(shè)計(jì)為非侵入式的孔庭,這意味著你的域邏輯代碼通常不會(huì)依賴于框架本身尺上。在集成層(比如數(shù)據(jù)訪問層),會(huì)存在一些依賴同時(shí)依賴于數(shù)據(jù)訪問技術(shù)和Spring圆到,但是這些依賴可以很容易地從代碼庫(kù)中分離出來(lái)怎抛。
本文檔是Spring框架的參考指南,如果你有任何請(qǐng)求构资、評(píng)論或問題抽诉,請(qǐng)給我們發(fā)郵件,關(guān)于框架本身的問題將在StackOverflow上討論(見https://spring.io.questions)吐绵。

  1. Spring入門
    這篇參考指南提供了Spring框架的詳細(xì)信息迹淌,包括了對(duì)所有功能的全面理解,同時(shí)也包括一些重要概念的背景(比如己单,依賴注入)唉窃。
    如果你才開始使用Spring,可以通過創(chuàng)建一個(gè)基于Spring Boot的應(yīng)用開始使用Spring框架纹笼。Spring Boot提供了一種快速創(chuàng)建Spring應(yīng)用的方式纹份,它基于Spring框架,支持約定優(yōu)于配置,使你可以盡快啟動(dòng)并運(yùn)行蔓涧。
    可以使用start.spring.io或遵循入門指南(比如件已,構(gòu)建RESTful web應(yīng)用入門)生成一個(gè)基本的項(xiàng)目。除了易于理解元暴,這些指南聚集于一個(gè)個(gè)任務(wù)篷扩,它們大部分都是基于Spring Boot的,同時(shí)也包含了Spring包下的其它項(xiàng)目茉盏,以便你可以考慮何時(shí)使用它們解決特定的問題鉴未。
  2. Spring框架簡(jiǎn)介
    Spring框架是基于Java平臺(tái)的,它為開發(fā)Java應(yīng)用提供了全方位的基礎(chǔ)設(shè)施支持鸠姨,并且它很好地處理了這些基礎(chǔ)設(shè)施铜秆,所以你只需要關(guān)注你的應(yīng)用本身即可。
    Spring可以使用POJO(普通的Java對(duì)象讶迁,plain old Java objects)創(chuàng)建應(yīng)用连茧,并且可以將企業(yè)服務(wù)非侵入式地應(yīng)用到POJO。這項(xiàng)功能適用于Java SE編程模型以及全部或部分的Java EE巍糯。
    那么梅屉,做為開發(fā)者可以從Spring獲得哪些好處呢?
    不用關(guān)心事務(wù)API就可以執(zhí)行數(shù)據(jù)庫(kù)事務(wù)鳞贷;
    不用關(guān)心遠(yuǎn)程API就可以使用遠(yuǎn)程操作;
    不用關(guān)心JMX API就可以進(jìn)行管理操作虐唠;
    不用關(guān)心JMS API就可以進(jìn)行消息處理搀愧。

譯者注:①JMX,Java Management eXtension疆偿,Java管理擴(kuò)展咱筛,是一個(gè)為應(yīng)用程序、設(shè)備杆故、系統(tǒng)等植入管理功能的框架迅箩。JMX可以跨越一系列異構(gòu)操作系統(tǒng)平臺(tái)、系統(tǒng)體系結(jié)構(gòu)和網(wǎng)絡(luò)傳輸協(xié)議处铛,靈活的開發(fā)無(wú)縫集成的系統(tǒng)饲趋、網(wǎng)絡(luò)和服務(wù)管理應(yīng)用。②JMS撤蟆,Java Message Service奕塑,Java消息服務(wù),是Java平臺(tái)上有關(guān)面向消息中間件(MOM)的技術(shù)規(guī)范家肯,它便于消息系統(tǒng)中的Java應(yīng)用程序進(jìn)行消息交換,并且通過提供標(biāo)準(zhǔn)的產(chǎn)生龄砰、發(fā)送、接收消息的接口簡(jiǎn)化企業(yè)應(yīng)用的開發(fā)。
2.1 依賴注入(DI)和控制反轉(zhuǎn)(IoC)
一個(gè)Java應(yīng)用程序换棚,從受限制的嵌入式應(yīng)用到n層的服務(wù)端應(yīng)用式镐,典型地是由相互合作的對(duì)象組成的,因此固蚤,一個(gè)應(yīng)用程序中的對(duì)象是相互依賴的娘汞。
Java平臺(tái)雖然提供了豐富的應(yīng)用開發(fā)功能,但是它并沒有把這些基礎(chǔ)構(gòu)建模塊組織成連續(xù)的整體颇蜡,而是把這項(xiàng)任務(wù)留給了架構(gòu)師和開發(fā)者价说。你可以使用設(shè)計(jì)模式,比如工廠模式风秤、抽象工廠模式鳖目、創(chuàng)建者模式、裝飾者模式以及服務(wù)定位器模式等缤弦,來(lái)構(gòu)建各種各樣的類和對(duì)象實(shí)例领迈,從而組成整個(gè)應(yīng)用程序。這些設(shè)計(jì)模式是很簡(jiǎn)單的碍沐,關(guān)鍵在于它們根據(jù)最佳實(shí)踐起了很好的名字狸捅,它們的名字可以很好地描述它們是干什么的、用于什么地方累提、解決什么問題尘喝,等等。這些設(shè)計(jì)模式都是最佳實(shí)踐的結(jié)晶斋陪,所以你應(yīng)該在你的應(yīng)用程序中使用它們朽褪。
Spring的控制反轉(zhuǎn)解決了上述問題,它提供了一種正式的解決方案无虚,你可以把不相干組件組合在一起缔赠,從而組成一個(gè)完整的可以使用的應(yīng)用。Spring根據(jù)設(shè)計(jì)模式編碼出了非常優(yōu)秀的代碼友题,所以可以直接集成到自己的應(yīng)用中嗤堰。因此,大量的組織機(jī)構(gòu)都使用Spring來(lái)保證應(yīng)用程序的健壯性和可維護(hù)性度宦。
背景
2004年Martin Fowler在他的網(wǎng)站上提出了關(guān)于控制反轉(zhuǎn)(IoC踢匣,Inversion of Control)的問題,“The question is, what aspect of control are [they] inverting?”戈抄,后來(lái)符糊,他又建議重新命名這項(xiàng)原則,使其可以自我解釋呛凶,從而提出了依賴注入(DI男娄,Dependency Injection)的概念。
2.2 模塊
Spring大約包含了20個(gè)模塊,這些模塊組成了核心容器(Core Container)模闲、數(shù)據(jù)訪問/集成(Data Access/Integration)建瘫、Web、AOP(面向切面編程尸折,Aspect Oriented Programming)啰脚、Instrumentation、消息處理(Messaging)和測(cè)試(Test)实夹,如下圖:
圖 2.1. Spring框架概述

spring框架概述

下面列出了每項(xiàng)功能對(duì)應(yīng)的模塊及其主題橄浓,它們都有人性的名字(artifact name),這些名字與依賴管理工具中的 artifact id 是相互對(duì)應(yīng)的亮航。
2.2.1 核心容器(Core Container)
核心容器包括spring-core荸实,spring-beansspring-context缴淋,spring-context-supportspring-expression(SpEL准给,Spring表達(dá)式語(yǔ)言,Spring Expression Language)等模塊重抖。
spring-corespring-beans模塊是Spring框架的基礎(chǔ)露氮,包括控制反轉(zhuǎn)和依賴注入等功能。BeanFactory是工廠模式的微妙實(shí)現(xiàn)钟沛,它移除了編碼式單例的需要畔规,并且可以把配置和依賴從實(shí)際編碼邏輯中解耦。
Contextspring-context)模塊是在Core和Bean模塊的基礎(chǔ)上建立起來(lái)的恨统,它以一種類似于JNDI注冊(cè)的方式訪問對(duì)象油讯。Context模塊繼承自Bean模塊,并且添加了國(guó)際化(比如延欠,使用資源束)、事件傳播沈跨、資源加載和透明地創(chuàng)建上下文(比如由捎,通過Servelet容器)等功能。Context模塊也支持Java EE的功能饿凛,比如EJB狞玛、JMX和遠(yuǎn)程調(diào)用等。ApplicationContext接口是Context模塊的焦點(diǎn)涧窒。spring-context-support提供了對(duì)第三方庫(kù)集成到Spring上下文的支持心肪,比如緩存(EhCache, Guava, JCache)、郵件(JavaMail)纠吴、調(diào)度(CommonJ, Quartz)硬鞍、模板引擎(FreeMarker, JasperReports, Velocity)等。
spring-expression模塊提供了強(qiáng)大的表達(dá)式語(yǔ)言用于在運(yùn)行時(shí)查詢和操作對(duì)象圖。它是JSP2.1規(guī)范中定義的統(tǒng)一表達(dá)式語(yǔ)言的擴(kuò)展固该,支持set和get屬性值锅减、屬性賦值、方法調(diào)用伐坏、訪問數(shù)組集合及索引的內(nèi)容怔匣、邏輯算術(shù)運(yùn)算确买、命名變量底循、通過名字從Spring IoC容器檢索對(duì)象念赶,還支持列表的投影庇谆、選擇以及聚合等簸州。
2.2.2 AOP和檢測(cè)(Instrumentation)
spring-aop模塊提供了面向切面編程(AOP)的實(shí)現(xiàn)沈堡,可以定義諸如方法攔截器和切入點(diǎn)等覆旭,從而使實(shí)現(xiàn)功能的代碼徹底的解耦出來(lái)信不。使用源碼級(jí)的元數(shù)據(jù)苔埋,可以用類似于.Net屬性的方式合并行為信息到代碼中懦砂。
spring-aspects模塊提供了對(duì)AspectJ的集成。
spring-instrument模塊提供了對(duì)檢測(cè)類的支持和用于特定的應(yīng)用服務(wù)器的類加載器的實(shí)現(xiàn)组橄。spring-instrument-tomcat模塊包含了用于tomcat的Spring檢測(cè)代理荞膘。
2.2.3 消息處理(messaging)
Spring 4 包含的spring-messaging模塊是從Spring集成項(xiàng)目的關(guān)鍵抽象中提取出來(lái)的,這些項(xiàng)目包括Message玉工、MessageChannel羽资、MessageHandler和其它服務(wù)于消息處理的項(xiàng)目。這個(gè)模塊也包含一系列的注解用于映射消息到方法遵班,這類似于Spring MVC基于編碼模型的注解屠升。
2.2.4 數(shù)據(jù)訪問與集成
數(shù)據(jù)訪問與集成層包含JDBC、ORM狭郑、OXM腹暖、JMS和事務(wù)模塊。 (譯者注:JDBC=Java Data Base Connectivity翰萨,ORM=Object Relational Mapping脏答,OXM=Object XML Mapping,JMS=Java Message Service)
spring-jdbc模塊提供了JDBC抽象層亩鬼,它消除了冗長(zhǎng)的JDBC編碼和對(duì)數(shù)據(jù)庫(kù)供應(yīng)商特定錯(cuò)誤代碼的解析殖告。
spring-tx模塊支持編程式事務(wù)和聲明式事務(wù),可用于實(shí)現(xiàn)了特定接口的類和所有的POJO對(duì)象雳锋。 (譯者注:編程式事務(wù)需要自己寫beginTransaction()黄绩、commit()、rollback()等事務(wù)管理方法玷过,聲明式事務(wù)是通過注解或配置由spring自動(dòng)處理爽丹,編程式事務(wù)粒度更細(xì))
spring-orm模塊提供了對(duì)流行的對(duì)象關(guān)系映射API的集成筑煮,包括JPAJDOHibernate等习劫。通過此模塊可以讓這些ORM框架和spring的其它功能整合咆瘟,比如前面提及的事務(wù)管理。
spring-oxm模塊提供了對(duì)OXM實(shí)現(xiàn)的支持诽里,比如JAXB袒餐、Castor、XML Beans谤狡、JiBX灸眼、XStream等。
spring-jms模塊包含生產(chǎn)(produce)和消費(fèi)(consume)消息的功能墓懂。從Spring 4.1開始焰宣,集成了spring-messaging模塊。
2.2.5 Web
Web層包括spring-web捕仔、spring-webmvc匕积、spring-websocketspring-webmvc-portlet等模塊榜跌。
spring-web模塊提供面向web的基本功能和面向web的應(yīng)用上下文闪唆,比如多部分(multipart)文件上傳功能、使用Servlet監(jiān)聽器初始化IoC容器等钓葫。它還包括HTTP客戶端以及Spring遠(yuǎn)程調(diào)用中與web相關(guān)的部分悄蕾。
spring-webmvc模塊(即Web-Servlet模塊)為web應(yīng)用提供了模型視圖控制(MVC)和REST Web服務(wù)的實(shí)現(xiàn)。Spring的MVC框架可以使領(lǐng)域模型代碼和web表單完全地分離础浮,且可以與Spring框架的其它所有功能進(jìn)行集成帆调。
spring-webmvc-portlet模塊(即Web-Portlet模塊)提供了用于Portlet環(huán)境的MVC實(shí)現(xiàn),并反映了spring-webmvc模塊的功能豆同。
2.2.6 Test
spring-test模塊通過JUnit和TestNG組件支持單元測(cè)試集成測(cè)試番刊。它提供了一致性地加載緩存Spring上下文,也提供了用于單獨(dú)測(cè)試代碼的模擬對(duì)象(mock object)影锈。
2.3 使用場(chǎng)景
前面提及的構(gòu)建模塊使得Spring在很多場(chǎng)景成為一種合理的選擇芹务,不管是資源受限的嵌入式應(yīng)用還是使用了事務(wù)管理和web集成框架的成熟的企業(yè)級(jí)應(yīng)用。
圖2.2. 典型的成熟的Spring web應(yīng)用程序
典型的成熟的Spring web應(yīng)用程序

Spring的聲明式事務(wù)管理可以使web應(yīng)用完成事務(wù)化精居,就像使用EJB容器管理的事務(wù)。所有客制的業(yè)務(wù)邏輯都可以使用簡(jiǎn)單的POJO實(shí)現(xiàn)潜必,并用Spring的IoC容器進(jìn)行管理靴姿。另外,還包括發(fā)郵件和驗(yàn)證功能磁滚,其中驗(yàn)證功能是從web層分離的佛吓,由你決定何處執(zhí)行驗(yàn)證宵晚。Spring的ORM可以集成JPA、hibernate和JDO等维雇,比如淤刃,使用Hibernate時(shí),可以繼續(xù)使用已存在的映射文件和標(biāo)準(zhǔn)的Hibernate的SessionFactory配置吱型。表單控制器無(wú)縫地把web層和領(lǐng)域模型集成在一起逸贾,移除了ActionForms和其它把HTTP參數(shù)轉(zhuǎn)換成領(lǐng)域模型的類。
圖2.3. 使用第三方web框架的Spring中間件
使用第三方web框架的Spring中間件

一些場(chǎng)景可能不允許你完全切換到另一個(gè)框架津滞。然而铝侵,Spring框架不強(qiáng)制你使用它所有的東西,它不是非此即彼(all-or-nothing)的解決方案触徐。前端使用Struts咪鲜、Tapestry、JSF或別的UI框架可以和Spring中間件集成撞鹉,從而使用Spring的事務(wù)管理功能疟丙。僅僅只需要使用ApplicationContext連接業(yè)務(wù)邏輯,并使用WebApplicationContext集成web層即可鸟雏。
圖2.4. 遠(yuǎn)程調(diào)用使用場(chǎng)景
遠(yuǎn)程調(diào)用使用場(chǎng)景

當(dāng)需要通過web服務(wù)訪問現(xiàn)有代碼時(shí)享郊,可以使用Spring的Hessian-Burlap-崔慧,Rmi-或者JaxRpcProxyFactory類拂蝎,遠(yuǎn)程訪問現(xiàn)有的應(yīng)用并非難事。
圖2.5. EJB-包裝現(xiàn)有的POJO
EJB-包裝現(xiàn)有的POJO

Spring框架也為EJB提供了訪問抽象層惶室,可以重新使用現(xiàn)有的POJO并把它們包裝到無(wú)狀態(tài)的會(huì)話bean中温自,以使其用于可擴(kuò)展的安全的web應(yīng)用中。
2.3.1 依賴管理和命名約定
依賴管理和依賴注入是兩碼事皇钞。為了讓應(yīng)用程序擁有這些Spring的非常棒的功能(如依賴注入)悼泌,需要導(dǎo)入所需的全部jar包,并在運(yùn)行時(shí)放在classpath下夹界,有可能的話編譯期也應(yīng)該放在classpath下馆里。這些依賴并不是被注入的虛擬組件,而是文件系統(tǒng)上典型的物理資源可柿。依賴管理的處理過程涉及到定位這些資源鸠踪、存儲(chǔ)并添加它們到classpath下。依賴可能是直接的(比如運(yùn)行時(shí)依賴于Spring)复斥,也可能是間接的(比如依賴于commons-dbcp营密,commons-dbcp又依賴于commons-pool)。間接的依賴又被稱作“傳遞”目锭,它們是最難識(shí)別和管理的评汰。
如果準(zhǔn)備使用Spring纷捞,則需要拷貝一份所需模塊的Spring的jar包。為了便于使用被去,Spring被打包成一系列的模塊以盡可能地減少依賴主儡,比如,如果不是在寫一個(gè)web應(yīng)用惨缆,那就沒必要引入spring-web模塊糜值。這篇文檔中涉及到的Spring模塊,我們使用spring-spring-.jar的命名約定踪央,其中臀玄,*****代表模塊的短名字(比如,spring-core畅蹂、spring-webmvc健无、spring-jms等等)。實(shí)際使用的jar包正常情況下都是帶有版本號(hào)的(比如液斜,spring-core-4.3.0.RELEASE.jar)累贤。
每個(gè)版本的Spring都會(huì)在以下地方發(fā)布artifact:
Maven中央倉(cāng)庫(kù),默認(rèn)的Maven查詢倉(cāng)庫(kù)少漆,并且不需要特殊的配置就可以使用臼膏。許多Spring依賴的公共庫(kù)也可以從Maven中央倉(cāng)庫(kù)獲得,并且大部分的Spring社區(qū)也使用Maven作為依賴管理工具示损,所以很方便渗磅。Maven中的jar包命名格式為
spring--<version>.jar*,其groupId是org.springframework检访。
特別為托管Spring的公共的Maven倉(cāng)庫(kù)始鱼。除了最終的GA版本,這個(gè)倉(cāng)庫(kù)也托管了開發(fā)的快照版本和里程碑版本脆贵。jar包和Maven中央倉(cāng)庫(kù)中的命名一致医清,所以這也是一個(gè)獲取Spring的開發(fā)版本的有用地方,可以和Maven中央倉(cāng)庫(kù)中部署的其它庫(kù)一起使用卖氨。這個(gè)倉(cāng)庫(kù)也包含了捆綁了所有Spring jar包的發(fā)行版的zip文件会烙,以便于下載。

因此筒捺,首先要做的事就是決定如何管理依賴關(guān)系柏腻,我們一般推薦使用自動(dòng)管理的系統(tǒng),比如Maven系吭、Gradle或Ivy五嫂,當(dāng)然你也可以手動(dòng)下載所有的jar包。
下面列出了Spring的artifact村斟,每個(gè)模塊更完整的描述贫导,參考 2.2 模塊 章節(jié)。
表2.1. Spring框架的artifact
groupId
artifactId
描述

org.springframework
spring-aop
基于代理的AOP

org.springframework
spring-aspects
基于切面的AspectJ

org.springframework
spring-beans
bean支持蟆盹,包括Groovy

org.springframework
spring-context
運(yùn)行時(shí)上下文孩灯,包括調(diào)度和遠(yuǎn)程調(diào)用抽象

org.springframework
spring-context-support
包含用于集成第三方庫(kù)到Spring上下文的類

org.springframework
spring-core
核心庫(kù),被許多其它模塊使用

org.springframework
spring-expression
Spring表達(dá)式語(yǔ)言

org.springframework
spring-instrument
JVM引導(dǎo)的檢測(cè)代理

org.springframework
spring-instrument-tomcat
tomcat的檢測(cè)代理

org.springframework
spring-jdbc
JDBC支持包逾滥,包括對(duì)數(shù)據(jù)源設(shè)置和JDBC訪問支持

org.springframework
spring-jms
JMS支持包峰档,包括發(fā)送和接收J(rèn)MS消息的幫助類

org.springframework
spring-messaging
消息處理的架構(gòu)和協(xié)議

org.springframework
spring-orm
對(duì)象關(guān)系映射,包括對(duì)JPA和Hibernate支持

org.springframework
spring-oxm
對(duì)象XML映射

org.springframework
spring-test
單元測(cè)試和集成測(cè)試組件

org.springframework
spring-tx
事務(wù)基礎(chǔ)寨昙,包括對(duì)DAO的支持及JCA的集成

org.springframework
spring-web
web支持包讥巡,包括客戶端及web遠(yuǎn)程調(diào)用

org.springframework
spring-webmvc
REST web服務(wù)及web應(yīng)用的MVC實(shí)現(xiàn)

org.springframework
spring-webmvc-portlet
用于Portlet環(huán)境的MVC實(shí)現(xiàn)

org.springframework
spring-websocket
WebSocket和SockJS實(shí)現(xiàn),包括對(duì)STOMP的支持

Spring的依賴和被依賴
Spring對(duì)大部分企業(yè)和其它外部工具提供了集成和支持舔哪,把強(qiáng)制性的外部依賴降到了最低欢顷,這樣就不需要為了簡(jiǎn)單地使用Spring而去尋找和下載大量的jar包了∽皆椋基本的依賴注入只有一個(gè)強(qiáng)制性的外部依賴抬驴,那就是日志管理(參考下面關(guān)于日志管理選項(xiàng)的詳細(xì)描述)。
下面列出依賴于Spring的應(yīng)用的基本配置步驟缆巧,首先使用Maven布持,然后Gradle,最后Ivy陕悬。在所有案例中题暖,如果有什么不清楚的地方,參考所用的依賴管理系統(tǒng)的文檔或查看一些范例代碼——Spring構(gòu)建時(shí)本身使用Gradle管理依賴捉超,所以我們的范例大部分使用Gradle或Maven胧卤。
Maven依賴關(guān)系管理
如果使用Maven作為依賴管理工具,甚至不需要明確地提供日志管理的依賴狂秦。例如灌侣,創(chuàng)建應(yīng)用上下文并使用依賴注入配置應(yīng)用程序,Maven的依賴關(guān)系看起來(lái)像下面一樣:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.0.RELEASE</version> <scope>runtime</scope> </dependency></dependencies>
1
2
3
4
5
6
7
8

1
2
3
4
5
6
7
8

就這樣裂问,注意如果不需要編譯Spring API侧啼,可以把scope聲明為runtime,這是依賴注入使用的典型案例堪簿。
上面的示例使用Maven中央倉(cāng)庫(kù)痊乾,如果使用Spring的Maven倉(cāng)庫(kù)(例如,里程碑或開發(fā)快照)椭更,需要在Maven配置中指定倉(cāng)庫(kù)位置哪审。
release版本:
<repositories> <repository> <id>io.spring.repo.maven.release</id> <url>http://repo.spring.io/release/</url> <snapshots><enabled>false</enabled></snapshots> </repository></repositories>
1
2
3
4
5
6
7

1
2
3
4
5
6
7

里程碑版本:
<repositories> <repository> <id>io.spring.repo.maven.milestone</id> <url>http://repo.spring.io/milestone/</url> <snapshots><enabled>false</enabled></snapshots> </repository></repositories>
1
2
3
4
5
6
7

1
2
3
4
5
6
7

快照版本:
<repositories> <repository> <id>io.spring.repo.maven.snapshot</id> <url>http://repo.spring.io/snapshot/</url> <snapshots><enabled>true</enabled></snapshots> </repository></repositories>
1
2
3
4
5
6
7

1
2
3
4
5
6
7

Maven的“物料清單式”依賴
使用Maven時(shí)可能會(huì)不小心混合了Spring不同版本的jar包。例如虑瀑,你可能會(huì)發(fā)現(xiàn)第三方庫(kù)或其它的Spring項(xiàng)目存在舊版本的傳遞依賴湿滓。如果沒有明確地聲明直接依賴滴须,各種各樣不可預(yù)料的情況將會(huì)出現(xiàn)。
為了解決這個(gè)問題叽奥,Maven提出了“物料清單式”(BOM)依賴的概念扔水。可以在dependencyManagement部分導(dǎo)入spring-framework-bom以保證所有的Spring依賴(不管直接還是傳遞依賴)使用相同的版本朝氓。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>4.3.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies></dependencyManagement>
1
2
3
4
5
6
7
8
9
10
11

1
2
3
4
5
6
7
8
9
10
11

使用BOM的另外一個(gè)好處是不再需要指定<version>屬性了:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency><dependencies>
1
2
3
4
5
6
7
8
9
10

1
2
3
4
5
6
7
8
9
10

Gradle依賴關(guān)系管理
為了在Gradle構(gòu)建系統(tǒng)中使用Spring倉(cāng)庫(kù)魔市,需要在repositories部分包含合適的URL:
repositories { mavenCentral() // and optionally... maven { url "http://repo.spring.io/release" }}
1
2
3
4
5

1
2
3
4
5

可以酌情把repositories URL中的/release修改為/milestone/snapshot。一旦倉(cāng)庫(kù)配置好了赵哲,就可以按Gradle的方式聲明依賴關(guān)系了待德。
dependencies { compile("org.springframework:spring-context:4.3.0.RELEASE") testCompile("org.springframework:spring-test:4.3.0.RELEASE")}
1
2
3
4

1
2
3
4

Ivy依賴關(guān)系管理
使用Ivy管理依賴關(guān)系有相似的配置選項(xiàng)。
ivysettings.xml中添加resolver配置使Ivy指向Spring倉(cāng)庫(kù):
<resolvers> <ibiblio name="io.spring.repo.maven.release" m2compatible="true" root="http://repo.spring.io/release/"/></resolvers>
1
2
3
4
5

1
2
3
4
5

可以酌情把root URL中的/release修改為/milestone/snapshot枫夺。一旦配置好了将宪,就可以按照慣例添加依賴了(在ivy.xml中):
<dependency org="org.springframework" name="spring-core" rev="4.3.0.RELEASE" conf="compile->runtime"/>
1
2

1
2

發(fā)行版的Zip文件
雖然使用支持依賴管理的構(gòu)建系統(tǒng)是獲取Spring框架的推薦方法,但是也支持通過下載Spring的發(fā)行版zip文件獲取橡庞。
發(fā)行版zip文件發(fā)布在了Sprng的Maven倉(cāng)庫(kù)上(這只是為了方便涧偷,不需要額外的Maven或其它構(gòu)建系統(tǒng)去下載它們)。
瀏覽器中打開http://repo.spring.io/release/org/springframework/spring毙死,并選擇合適版本的子目錄燎潮,就可以下載發(fā)行版的zip文件了。發(fā)行文件以-dist.zip結(jié)尾扼倘,例如确封,spring-framework-{spring-version}-RELEASE-dist.zip。發(fā)行文件也包含里程碑版本和快照版本再菊。
2.3.2 日志管理
對(duì)于Spring來(lái)說日志管理是非常重要的依賴關(guān)系爪喘,因?yàn)閍)它是唯一的強(qiáng)制性外部依賴,b)每個(gè)人都喜歡從他們使用的工具看到一些輸出纠拔,c)Spring集成了許多其它工具秉剑,它們都選擇了日志管理的依賴。應(yīng)用程序開發(fā)者的目標(biāo)之一通常是在整個(gè)應(yīng)用程序(包括所有的外部組件)的中心位置統(tǒng)一配置日志管理稠诲,這是非常困難的因?yàn)楝F(xiàn)在有很多日志管理的框架可供選擇侦鹏。
Spring中強(qiáng)制的日志管理依賴是Jakarta Commons Logging API(JCL)。我們編譯了JCL臀叙,并使JCL的Log對(duì)象對(duì)繼承了Spring框架的類可見略水。對(duì)用戶來(lái)說所有版本的Spring使用相同的日志管理庫(kù)很重要:遷移很簡(jiǎn)單因?yàn)镾pring保存了向后兼容,即使對(duì)于擴(kuò)展了Spring的應(yīng)用也能向后兼容劝萤。我們是怎么做到的呢渊涝?我們讓Spring的一個(gè)模塊明確地依賴于commons-logging(JCL的典型實(shí)現(xiàn)),然后讓所有其它模塊都在編譯期依賴于這個(gè)模塊。例如跨释,使用Maven胸私,你想知道哪里依賴了commons-logging,其實(shí)是Spring確切地說是其核心模塊spring-core依賴了鳖谈。
commons-logging的優(yōu)點(diǎn)是不需要其它任何東西就可以使應(yīng)用程序運(yùn)轉(zhuǎn)起來(lái)盖文。它擁有一個(gè)運(yùn)行時(shí)發(fā)現(xiàn)算法用于在classpath中尋找其它日志管理框架并且適當(dāng)?shù)剡x擇一個(gè)使用(或者告訴它使用哪個(gè))。如果不需要其它的功能了蚯姆,你就可以從JDK(java.util.logging或JUL)得到一份看起來(lái)很漂亮的日志了。你會(huì)發(fā)現(xiàn)大多數(shù)情況下你的Spring應(yīng)用程序工作得很好且日志很好地輸出到了控制臺(tái)洒敏,這很重要龄恋。
不使用Commons Logging
不幸的是,commons-logging的運(yùn)行時(shí)發(fā)現(xiàn)算法雖然對(duì)于終端用戶很方便凶伙,但存在一定的問題郭毕。如果我們能讓時(shí)光倒流,重新開始Spring項(xiàng)目函荣,我們會(huì)使用不同的日志管理依賴显押。首要選擇可能是Simple Logging Facade for Java(SLF4J),它也被用于了其它一些使用Spring的工具中傻挂。
有兩種方式關(guān)掉commons-logging
spring-core模塊中去除對(duì)commons-logging的依賴(因?yàn)檫@是唯一明確依賴于commons-logging的地方)
依賴于一個(gè)特定的commons-logging且把其jar包換成一個(gè)空jar包(具體做法參考SLF4J FAQ

如下乘碑,在dependencyManagement中添加部分代碼就可以排除掉commons-logging了:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.0.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency></dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13

1
2
3
4
5
6
7
8
9
10
11
12
13

現(xiàn)在這個(gè)應(yīng)用可能是殘缺的,因?yàn)樵赾lasspath上沒有JCL API的實(shí)現(xiàn)金拒,所以需要提供一個(gè)新的去修復(fù)它兽肤。下個(gè)章節(jié)我們將以SLF4J為例子為JCL提供一個(gè)替代實(shí)現(xiàn)。
使用SLF4J
SLF4J是一個(gè)更干凈的依賴绪抛,且運(yùn)行時(shí)比commons-logging更有效率资铡,因?yàn)樗褂镁幾g期而非運(yùn)行時(shí)綁定其它日志管理框架。這也意味著你不得不明確地指出運(yùn)行時(shí)想做什么幢码,并定義和配置它笤休。SLF4J可以綁定許多公共的日志管理框架,所以通常你可以選擇一個(gè)已經(jīng)使用的症副,綁定它并配置和管理店雅。
SLF4J可以綁定許多公共的日志管理框架,包括JCL贞铣,同時(shí)也是其它日志管理框架和它本身的橋梁底洗。所以為了在Spring中使用SLF4J,需要用SLF4J-JCL橋梁代替commons-logging依賴咕娄。一旦這樣做了然后日志記錄從Spring內(nèi)部調(diào)用轉(zhuǎn)變成調(diào)用SLF4J API亥揖,因此,如果應(yīng)用中的其它庫(kù)使用了這個(gè)API,然后將有一個(gè)統(tǒng)一的地方用于配置和管理日志费变。
通常的選擇是把Spring橋接到SLF4J摧扇,然后從SLF4J到Log4J提供明確的綁定。需要提供4個(gè)依賴關(guān)系(且排除掉commons-logging):橋梁挚歧、SLF4J API扛稽、綁定到Log4J和Log4J的實(shí)現(xiàn)本身。在Maven中看起來(lái)像下面一樣:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.0.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.5.8</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.5.8</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.8</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency></dependencies>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

似乎這么多依賴僅僅用于獲取日志滑负。在類加載器問題上在张,它應(yīng)該表現(xiàn)得比commons-logging更好,尤其是在像OSGi這樣嚴(yán)格的容器中矮慕。而且帮匾,它也有性能優(yōu)勢(shì)因?yàn)榻壎òl(fā)生在編譯期而非運(yùn)行時(shí)。
對(duì)于SLF4J用戶更普遍的選擇是直接綁定Logback痴鳄,這需要更少的步驟瘟斜,生成更少的依賴。這樣移除了額外的綁定因?yàn)長(zhǎng)ogback直接實(shí)現(xiàn)了SLF4J痪寻,所以僅僅需要兩個(gè)庫(kù)即可而不用四個(gè)庫(kù)(jcl-over-slf4jlogback)螺句。這樣做的話還需要把slf4j-api依賴從其它外部依賴(不是Spring)中排除掉,因?yàn)樵赾lasspath下僅僅需要一個(gè)版本的API橡类。
使用Log4J
許多人使用Log4J作為日志管理框架蛇尚。它是高效和完善的,實(shí)際上在構(gòu)建和測(cè)試Spring的時(shí)候我們運(yùn)行時(shí)就是使用它顾画。Spring也提供了一些工具用于配置和初始化Log4J佣蓉,所以某些模塊在編譯期可以選擇依賴于Log4J。
為了使Log4J代替默認(rèn)的JCL依賴(commons-logging)亲雪,僅僅提供一個(gè)配置文件(log4j.propertieslog4j.xml)放在classpath根目錄下即可勇凭。Maven中的配置如下:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.3.0.RELEASE</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> </dependency></dependencies>
1
2
3
4
5
6
7
8
9
10
11
12

1
2
3
4
5
6
7
8
9
10
11
12

下面是log4j.properties的樣例,用于打印日志到控制臺(tái):
log4j.rootCategory=INFO, stdoutlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %t %c{2}:%L - %m%nlog4j.category.org.springframework.beans.factory=DEBUG
1
2
3
4
5
6
7

1
2
3
4
5
6
7

帶有本地JCL的運(yùn)行時(shí)容器
許多人在一個(gè)容器中運(yùn)行Spring應(yīng)用程序义辕,而這個(gè)容器本身又提供了JCL的實(shí)現(xiàn)虾标。IBM的Websphere Application Server(WAS)是一個(gè)原型祥诽。這經(jīng)常引起一些問題甚颂,而且不幸的是沒有很好的解決方案,簡(jiǎn)單地從應(yīng)用中排除掉commons-logging在大部分情況下還不夠勋桶。
更清楚地描述:這個(gè)問題通常并不與JCL本身有關(guān)基显,甚至是commons-logging蘸吓,而是他們綁定了commons-logging到另一個(gè)框架(通常是Log4J)。這會(huì)失敗是因?yàn)?strong>commons-logging改變了在舊版本(1.0)和新版本(1.1)中執(zhí)行運(yùn)行時(shí)發(fā)現(xiàn)算法的方式撩幽,其中库继,舊版本在一些容器中還在使用箩艺,新版本是現(xiàn)在大部分人使用的。Spring沒有使用JCL API的其它部分宪萄,所以不會(huì)有什么問題艺谆,但是一旦Spring或你的應(yīng)用試圖記錄日志就會(huì)發(fā)現(xiàn)Log4J不能工作了。(譯者注:此處的意思是即使發(fā)生了上面的沖突拜英,Spring也不會(huì)去檢查静汤,直接運(yùn)行的時(shí)候需要打印日志的時(shí)候才會(huì)出錯(cuò))
在WAS這個(gè)案例中,最簡(jiǎn)單的方法就是倒置類加載器的繼承(IBM稱作“parent last”居凶,即把父類放后面)虫给,以便應(yīng)用程序而不是容器控制JCL依賴。這種選擇并不總是管用的侠碧,在公共領(lǐng)域有很多其它建議的替代方案抹估,且你的里程可能會(huì)隨著確切的版本和容器的特性而改變。(譯者注:此處的意思是上面介紹的方法并不是唯一的舆床,需要根據(jù)不同的版本和容器作出相應(yīng)的方案)
二、Spring 4.x中的新特性

  1. Spring 4.0的新特性和增強(qiáng)功能
    Spring最初發(fā)行于2004年嫁佳,從那以后有過幾次重大的修改挨队,Spring 2.0提供了XML命名空間和AspectJ,Spring 2.5包含了注解驅(qū)動(dòng)的配置蒿往,Spring 3.0以Java 5+為框架的代碼基礎(chǔ)盛垦,并使用其新特性,諸如以@Configuration注解的模型等瓤漏。
    4.0版本是最近一次重大的修改腾夯,且首次全面支持Java 8的新特性。你仍然可以繼續(xù)使用Java的舊版本蔬充,但是最低要求提升到了Java SE 6蝶俱。我們也利用這次重大修改移除了很多過時(shí)的類和方法。
    升級(jí)到Spring 4.0的指導(dǎo)手冊(cè)參見Spring Framework GigHub Wiki饥漫。
    3.1 改進(jìn)了入門體驗(yàn)
    新的spring.io網(wǎng)址提供了完整的入門指南幫你學(xué)習(xí)Spring榨呆。更多的指南請(qǐng)參考本文檔的 1. Spring入門。新網(wǎng)址也提供了對(duì)發(fā)布在Spring下的許多項(xiàng)目的深入理解庸队。
    如果你是Maven用戶积蜻,你可能會(huì)對(duì)現(xiàn)在發(fā)布在每個(gè)Spring版本中的物料清單POM文件感興趣。
    3.2 移除了過時(shí)的包和方法
    4.0版本移除了所有過時(shí)的包以及許多過時(shí)的類和方法彻消。如果從之前的版本升級(jí)過來(lái)竿拆,則需要保證修復(fù)所有對(duì)過時(shí)API的調(diào)用。
    完整的改變請(qǐng)參考API Differences Report宾尚。
    注意丙笋,可選的第三方依賴已經(jīng)升級(jí)到2010/2011的版本(也就是說,Spring 4只支持發(fā)布在2010年之后的版本),尤其是不见,Hibernate 3.6+澳化,EhCache 2.1+,Quartz 1.8+稳吮,Groovy 1.8+缎谷,Joda-Time 2.0+。有一個(gè)例外灶似,Spring 4需要Hibernate Validator 4.3+和Jackson2.0+(Spring 3.2保留了對(duì)Jackson1.8/1.9的支持列林,但現(xiàn)在過時(shí)了)。
    3.3 Java 8(以及6和7)
    Spring 4.0對(duì)Java 8的幾個(gè)新特性提供了支持酪惭,允許使用lambda表達(dá)式希痴,在Spring回調(diào)接口中使用方法引用。對(duì)java.timeJSR-310)有很好地支持春感,把幾個(gè)已存在的注解改造為@Repeatable砌创,還可以使用java 8的參數(shù)名稱發(fā)現(xiàn)作為替代方案來(lái)編譯啟用了調(diào)試信息的代碼(基于-parameters的編譯器標(biāo)志,譯者注:參數(shù)名稱發(fā)現(xiàn)是通過反射獲取參數(shù)的名稱鲫懒,而不是類型)嫩实。
    Spring保留了對(duì)舊版本Java和JDK的兼容,具體地說是Java SE 6和更高版本都全面支持(最低JDK6.18窥岩,發(fā)布于2010年1月)甲献。盡管如此,我們依然建議基于Spring 4的新項(xiàng)目使用Java 7或者8颂翼。
    3.4 Java EE 6和7
    Java EE 6+及其相關(guān)的JPA 2.0和Servlet 3.0晃洒,被認(rèn)為是Spring 4的基線。為了兼容Google App Engine和舊的應(yīng)用服務(wù)器朦乏,可能要在Servlet 2.5環(huán)境中部署Spring 4球及。然而,Servlet 3.0+是我們強(qiáng)烈推薦的呻疹,并且它也是Spring測(cè)試的先決條件桶略,也是模擬軟件包測(cè)試開發(fā)環(huán)境設(shè)置的先決條件。
    如果你是WebSphere 7用戶诲宇,請(qǐng)一定要安裝JPA 2.0包际歼,如果是WebLogic 10.3.4或更高版本,還要安裝JPA 2.0補(bǔ)丁姑蓝,這樣Spring 4才能兼容這兩個(gè)服務(wù)器鹅心。

更有遠(yuǎn)見的主意,Spring 4.0現(xiàn)在支持Java EE 7適用的規(guī)范纺荧,尤其是JMS 2.0旭愧、JTA 1.2颅筋、JPA 2.1、Bean Validation 1.1和JSR-236 Concurrency Utilities输枯。像往常一樣议泵,這種支持只針對(duì)個(gè)人的使用,比如在Tomcat或獨(dú)立的環(huán)境中桃熄。盡管如此先口,當(dāng)Spring應(yīng)用部署在Java EE 7的服務(wù)器上依然運(yùn)行良好。
注意瞳收,Hibernate 4.3是JPA 2.1的提供者碉京,因此只在Spring 4.0中支持。同樣地螟深,Hibernate Validator 5.0是Bean Validation 1.1的提供者谐宙。因此,這兩項(xiàng)并不被Spring 3.2官方支持界弧。
3.5 Groovy Bean定義DSL
從Spring 4.0開始凡蜻,可以使用Groovy DSL定義外部bean了。在概念上垢箕,這與使用XML配置bean類似划栓,但是可以使用更簡(jiǎn)潔的語(yǔ)法。使用Groovy還可以很容易地把bean定義直接嵌入到引導(dǎo)代碼中舰讹。例如:
def reader = new GroovyBeanDefinitionReader(myApplicationContext)reader.beans { dataSource(BasicDataSource) { driverClassName = "org.hsqldb.jdbcDriver" url = "jdbc:hsqldb:mem:grailsDB" username = "sa" password = "" settings = [mynew:"setting"] } sessionFactory(SessionFactory) { dataSource = dataSource } myService(MyService) { nestedBean = { AnotherBean bean -> dataSource = dataSource } }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

更多信息請(qǐng)查閱GroovyBeanDefinitionReaderjavadocs茅姜。
3.6 核心容器的改進(jìn)
核心容器有以下幾點(diǎn)改進(jìn):
Spring注入Bean時(shí)把泛型當(dāng)作一種限定符闪朱。例如月匣,使用Spring的Repository時(shí),可以注入特定的實(shí)現(xiàn): @Autowired Repository<Customer> customerRepository奋姿。
使用Spring的元注解锄开,可以開發(fā)暴露特定屬性的自定義注解
Bean可以在被裝配到list或數(shù)組中時(shí)排好序称诗。通過@Order注解和Ordered接口支持萍悴。
@Lazy注解可以用于注入點(diǎn),也可用于@Bean定義上寓免。
引入了@Description注解以便開發(fā)者使用基于Java的配置癣诱。
通過@Conditional注解可以定義有條件過濾的bean。這與@Profile類似但允許用戶自定義開發(fā)策略袜香。
基于CGLIB的代理類不再需要默認(rèn)的構(gòu)造方法撕予。通過objenesis庫(kù)進(jìn)行支持,它被重新打包到Spring中并作為Spring框架的一部分發(fā)布蜈首。使用這種策略实抡,生成代理實(shí)例時(shí)沒有構(gòu)造方法將被調(diào)用欠母。
添加了管理時(shí)區(qū)的支持。例如LocaleContext吆寨。

3.7 Web的改進(jìn)
保留了Servlet 2.5服務(wù)器的部署赏淌,但Spring 4.0現(xiàn)在主要關(guān)注Servlet 3.0+環(huán)境的部署。如果使用Spring MVC測(cè)試框架啄清,需要保證在test classpath上包含Servlet 3.0的兼容JAR包六水。
除了下面要講的WebSocket方面的支持,在Spring的Web模塊還包含以下幾點(diǎn)改進(jìn):
可以添加新的@RestController注解到Spring MVC應(yīng)用上盒延,而不用再添加@ResponseBody到每個(gè)@RequestMapping方法上缩擂。
添加了AsyncRestTemplate類,當(dāng)開發(fā)REST客戶端時(shí)允許非阻塞異步支持添寺。
當(dāng)開發(fā)Spring MVC應(yīng)用時(shí)提供了全面的時(shí)區(qū)支持胯盯。

3.8 WebSocket、SockJS 和STOMP Messaging
新的spring-websocket模塊全面支持在web應(yīng)用中客戶端與服務(wù)端基于WebSocket雙向通信计露。它兼容JSR-356博脑、Java WebSocket API,另外還提供了基于SockJS的后退選項(xiàng)(例如票罐,WebSocket仿真)用于不支持WebSocket協(xié)議的瀏覽器(例如叉趣,IE < 10)。
新的spring-messaging模塊支持STOMP作為WebSocket的子協(xié)議與一個(gè)注解程序模型一起用于路由并處理來(lái)自WebSocket客戶端的STOMP消息该押。因此疗杉,一個(gè)@Controller可以同時(shí)包含@RequestMapping@MessageMapping方法用于處理HTTP請(qǐng)求和來(lái)自WebSocket客戶端的消息。新的spring-messaging模塊還包含從以前Spring集成項(xiàng)目提取出來(lái)的關(guān)鍵抽象作為基于消息處理的應(yīng)用的基礎(chǔ)蚕礼,如Message烟具、MessageChannelMesaageHandler等奠蹬。
更詳細(xì)的內(nèi)容請(qǐng)參考 25 WebSocket支持 章節(jié)朝聋。
3.9 測(cè)試的改進(jìn)
除了移除了spring-test模塊過時(shí)的代碼,Spring 4.0還引入了幾個(gè)新特性用于單元測(cè)試和集成測(cè)試:
幾乎spring-test模塊的所有注解(例如囤躁,@ContextConfiguration冀痕、@WebAppConfiguration@ContextHierarchy狸演、@ActiveProfiles等)都可以作為元注解用于創(chuàng)建自定義注解并減少測(cè)試套件中的重復(fù)配置言蛇。
有效的bean定義配置文件可以通過編程解析,只要簡(jiǎn)單地實(shí)現(xiàn)自定義的ActiveProfilesResolver并注冊(cè)@ActiveProfilesresolver屬性即可宵距。
spring-core模塊引入了新的SocketUtils類腊尚,用于掃描本地空閑的TCP和UDP服務(wù)端口。這項(xiàng)功能并不特定用于測(cè)試消玄,但是當(dāng)寫需要socket的集成測(cè)試時(shí)非常有用跟伏,例如丢胚,啟動(dòng)內(nèi)存中的SMTP服務(wù)器、FTP服務(wù)器受扳、Servlet容器等的測(cè)試携龟。
自Spring 4.0起,org.springframework.mock.web包中模擬集合以Servlet 3.0為基礎(chǔ)勘高。此外峡蟋,一些Servlet API模擬(例如,MockHttpServletRequest华望,MockServletContext等)有少許增強(qiáng)并可通過配置改進(jìn)蕊蝗。

  1. Spring 4.1的新特性和增強(qiáng)功能
    4.1 JMS的改進(jìn)
    Spring 4.1引入了一個(gè)更簡(jiǎn)單的方法來(lái)注冊(cè)JMS監(jiān)聽器,那就是使用@JmsListener注解bean的方法赖舟。XML的命名空間也得到了增強(qiáng)以支持這項(xiàng)新特性(jms:annotation-driven)蓬戚,也可以通過Java配置來(lái)完全使用這項(xiàng)新特性(@EnableJmsJmsListenerContainerFactory)宾抓,還可以使用JmsListenerConfigurer來(lái)編程式地注冊(cè)監(jiān)聽器子漩。
    Spring 4.1還可以與4.0中引入的spring-messaging合作使用:
    消息監(jiān)聽器可以擁有更彈性的簽名,并且可以受益于標(biāo)準(zhǔn)的消息處理注解石洗,比如幢泼,@Payload, @Header, @Headers, @SendTo,等等讲衫,也可以使用標(biāo)準(zhǔn)的Message代替javax.jms.Message作為方法的參數(shù)缕棵。
    新的JmsMessageOperation接口可以被使用,并且允許JmsTemplate像使用Message一樣操作涉兽。

最后招驴,Spring 4.1還提供了以下各種各樣的改進(jìn):
JmsTemplate支持同步的請(qǐng)求應(yīng)答操作。
每個(gè)jms:listener元素可以指定監(jiān)聽器的優(yōu)先級(jí)花椭。
通過BackOff實(shí)現(xiàn)可以配置消息監(jiān)聽容器的恢復(fù)選項(xiàng)忽匈。
JMS 2.0支持共享消費(fèi)者房午。

4.2 緩存的改進(jìn)
Spring 4.1支持JCache(JSR-107)注解矿辽,直接使用Spring已存在的緩存配置和基礎(chǔ)架構(gòu)即可,不需要其它的改變郭厌。
Spring 4.1也極大地改進(jìn)了它的緩存策略:
可以在運(yùn)行時(shí)使用CacheResolver解析緩存袋倔。因此,不再?gòu)?qiáng)制使用value參數(shù)來(lái)定義緩存的名稱折柠。
更多自定義的操作:緩存解析宾娜,緩存管理,鍵生成器扇售。
新的@CacheConfig注解允許通用設(shè)置在類級(jí)別共享前塔,而不需要啟用任何緩存操作嚣艇。
使用CacheErrorHandler更好地處理緩存的異常。

Spring 4.1還為了添加putIfAbsent方法對(duì)CacheInterface做了重大改變华弓。
4.3 Web的改進(jìn)
新的抽象ResourceResolver, ResourceTransformerResourceUrlProvider擴(kuò)展了已存在的基于ResourceHttpRequestHandler的資源處理程序食零。一些內(nèi)置的實(shí)現(xiàn)提供了對(duì)帶版本的資源URL(為了有效的HTTP緩存)、定位gzip資源寂屏、生成HTML 5 AppCache清單等的支持贰谣。參考21.16.9 資源服務(wù)
JDK 1.8的java.util.Optional現(xiàn)在支持@RequestParam, @RequestHeader@MatrixVariable控制器方法的參數(shù)迁霎。
ListenableFuture作為返回值替代了DeferredResult吱抚,在這方面一項(xiàng)基礎(chǔ)服務(wù)(或者說對(duì)AsyncRestTemplate的調(diào)用)已經(jīng)返回了ListenableFuture
@ModelAttribute方法現(xiàn)在按照依賴間的順序依次被調(diào)用考廉。
Jackson的@JsonView直接作用于@ResponseBodyResponseEntity控制器方法秘豹,用于序列化同一個(gè)POJO的不同形式(比如,匯總和詳情)昌粤。這可以通過為模型屬性添加指定key的序列化視圖類型來(lái)渲染視圖憋肖。參考Jackson序列化視圖支持
Jackson現(xiàn)在支持JSONP婚苹。參考Jackson JSONP支持岸更。
新的生命周期選項(xiàng)可用于在控制器方法返回后且響應(yīng)寫出前攔截@ResponseBodyResponseEntity方法,聲明一個(gè)@ControllerAdvice bean實(shí)現(xiàn)ResponseBodyAdvice即可膊升,內(nèi)置的@JsonView和JSONP恰恰利用了這點(diǎn)怎炊。參考21.4.1 使用HandlerInterceptor攔截請(qǐng)求
有三個(gè)HttpMessageConverter選項(xiàng): Gson——比Jackson更輕的足跡廓译,已用于Spring Android中评肆。
Google協(xié)議緩沖——企業(yè)內(nèi)部有效的服務(wù)間通信數(shù)據(jù)協(xié)議,但是也可以作為JSON和XML暴露于瀏覽器中非区。
通過jackson-dataformat-xml擴(kuò)展支持基于XML的Jackson瓜挽。當(dāng)使用@EnableWebMvc<mvc:annotation-driven>時(shí),如果classpath下存在jackson-dataformat-xml則默認(rèn)會(huì)替代JAXB2征绸。

類似JSP的視圖現(xiàn)在可以通過引用控制器映射的名稱與控制器建立鏈接久橙。默認(rèn)的名稱將被賦給每一個(gè)@RequestMapping。例如管怠,FooController擁有方法handleFoo淆衷,它的名稱為“FC#handleFoo”。命名策略是可插拔的渤弛,也可以通過name屬性為@RequestMapping明確地命名祝拯。在Spring JSP標(biāo)簽庫(kù)中新的mvcUrl功能可以讓使用JSP頁(yè)面變得更方便。參考21.7.2 從視圖為Controller及其方法創(chuàng)建URI她肯。
ResponseEntity提供了創(chuàng)建者風(fēng)格的API用于引導(dǎo)控制器方法為服務(wù)端響應(yīng)做準(zhǔn)備佳头。例如鹰贵,ResponseEntity.ok()
RequestEntity是一種新類型康嘉,它提供了創(chuàng)建者風(fēng)格的API用于引導(dǎo)客戶端REST代碼為HTTP請(qǐng)求做準(zhǔn)備砾莱。
MVC Java配置與XML命名空間: 視圖解析器可以被配置,包含對(duì)內(nèi)容協(xié)商的支持凄鼻。參考21.16.8 視圖解析器腊瑟。
視圖控制器內(nèi)置了對(duì)重定向及設(shè)置響應(yīng)狀態(tài)的支持。應(yīng)用程序可以使用它配置重定向的URL块蚌,用視圖渲染 404 響應(yīng)闰非,發(fā)送“無(wú)內(nèi)容”響應(yīng),等等峭范。一些用例請(qǐng)點(diǎn)擊這里财松。
內(nèi)置了自定義的路徑匹配。參考21.16.11 路徑匹配纱控。

支持Groovy標(biāo)記模板(基于Groovy 2.3)辆毡。參考GroovyMarkupConfigurer和各自的ViewResolver及視圖實(shí)現(xiàn) 。

4.4 WebSocket 消息處理的改進(jìn)
支持SockJS(Java)客戶端甜害。參考SockJsClient和同包下的類舶掖。
當(dāng)STOMP客戶端訂閱和取消訂閱時(shí)新的應(yīng)用上下文事件SessionSubscribeEventSessionUnsubscribeEvent會(huì)被觸發(fā)。
新的作用域“websocket”尔店。參考25.4.14 WebSocket作用域眨攘。
@SendToUser只能把單會(huì)話作為目標(biāo),而且不需要用戶身份驗(yàn)證嚣州。
@MessageMapping方法可以使用點(diǎn)“.”代替斜杠“/”作為分割符鲫售。參考SPR-11660
STOMP/WebSocket監(jiān)測(cè)信息收集和日志管理该肴。參考25.4.16 運(yùn)行時(shí)監(jiān)測(cè)情竹。
得到極大優(yōu)化和改進(jìn)的日志管理保留了可讀性和簡(jiǎn)潔性,甚至是在DEBUG水平匀哄。
優(yōu)化了消息的創(chuàng)建秦效,包含了對(duì)臨時(shí)消息可變性的支持,并避免自動(dòng)消息id和時(shí)間戳的創(chuàng)建拱雏。參考Javadoc中的MessageHeaderAccessor棉安。
在WebSocket會(huì)話創(chuàng)建60秒后沒有活動(dòng)則將會(huì)關(guān)閉STOMP/WebSocket連接底扳。參考SPR-11884铸抑。

4.5 測(cè)試的改進(jìn)
Groovy腳本現(xiàn)在可用于配置ApplicationContext,其中ApplicationContext在測(cè)試上下文框架中被加載用于集成測(cè)試衷模。參考帶有Groovy腳本的上下文配置鹊汛。
在事務(wù)測(cè)試方法中可以通過TestTransaction API編程式地開始和結(jié)束測(cè)試事務(wù)蒲赂。參考編程式事務(wù)管理
SQL腳本執(zhí)行可以通過在每個(gè)類或方法上添加新的@Sql@SqlConfig注解聲明式地配置刁憋。參考14.5.7執(zhí)行SQL腳本滥嘴。
可以通過新的@TestPropertySource注解配置用于測(cè)試的property源文件,它能夠自動(dòng)地重寫系統(tǒng)和應(yīng)用的property源文件至耻。參考帶有測(cè)試property源文件的上下文配置若皱。
默認(rèn)的TestExecutionListeners能夠被自動(dòng)地發(fā)現(xiàn)。參考自動(dòng)發(fā)現(xiàn)默認(rèn)的TestExecutionListeners尘颓。
自定義的TestExecutionListeners能夠被自動(dòng)地合并到默認(rèn)的監(jiān)聽器中走触。參考合并TestExecutionListeners
測(cè)試上下文框架中事務(wù)測(cè)試的文檔提供了更多深入的解釋和附加的案例疤苹。參考14.5.6 事務(wù)管理互广。
對(duì)MockServletContext, MockHttpServletRequest和其它Servlet API模擬的各種各樣的改進(jìn)。
AssertThrows被重構(gòu)了用于支持Throwable而不是Exception卧土。
在Spring MVC測(cè)試中惫皱,JSON Assert作為使用JSONPath的額外選項(xiàng),可以為JSON響應(yīng)斷言尤莺,這就像使用XMLUnit為XML斷言一樣旅敷。
可以通過MockMvcConfigurer創(chuàng)建MockMvcBuilder。這使得應(yīng)用Spring安全設(shè)置變得很容易颤霎,也可用于把通用設(shè)置壓縮進(jìn)任何第三方框架或項(xiàng)目中扫皱。
MockRestServiceServer現(xiàn)在支持AsyncRestTemplate用于客戶端測(cè)試。

  1. Spring 4.2的新特性和增強(qiáng)功能
    5.1 核心容器的改進(jìn)
    類似@Bean的注解被發(fā)現(xiàn)并用于處理Java 8的默認(rèn)方法捷绑,允許實(shí)現(xiàn)接口的配置類帶有默認(rèn)的@Bean方法韩脑。(譯者注:@Bean注解可以用到Java 8接口的默認(rèn)方法上,然后配置類實(shí)現(xiàn)這個(gè)接口一樣可以得到bean)
    配置類現(xiàn)在可以聲明@Import引入普通的組件類了粹污,允許混合引入配置類和組件類段多。(譯者注:@Import以前只能引入配置類,現(xiàn)在也可以引入沒有任何注解的組件類)
    配置類可以聲明一個(gè)@Order值壮吩,按照一定的順序處理(比如进苍,按名稱重寫bean),甚至是在classpath掃描的時(shí)候鸭叙。(譯者注:@Order值大的會(huì)覆蓋小的)
    @Resource注入的元素支持@Lazy聲明觉啊,像@Autowired一樣,對(duì)請(qǐng)求目標(biāo)的bean接受延遲初始化的代理沈贝。
    應(yīng)用程序事件現(xiàn)在提供基于注解的模型了杠人,也可以發(fā)布任何事件。 bean中的任何公共方法都能夠通過@EventListener注解來(lái)消費(fèi)事件。
    @TransactionalEventListener提供了事務(wù)綁定的事件支持嗡善。

Spring 4.2提供了一流的支持用于聲明和查找注解屬性的別名辑莫。新的@AliasFor注解可以用來(lái)在單個(gè)注解內(nèi)聲明一對(duì)別名屬性,或者聲明一個(gè)從自定義注解屬性到元注解屬性的別名罩引。
以下注解都通過@AliasFor翻新過了各吨,以便為value屬性提供更有意義的別名:@Cacheable, @CacheEvict, @CachePut, @ComponentScan, @ComponentScan.Filter, @ImportResource, @Scope, @ManagedResource, @Header, @Payload, @SendToUser, @ActiveProfiles, @ContextConfiguration, @Sql, @TestExecutionListeners, @TestPropertySource, @Transactional, @ControllerAdvice, @CookieValue, @CrossOrigin, @MatrixVariable, @RequestHeader, @RequestMapping, @RequestParam, @RequestPart, @ResponseStatus, @SessionAttributes, @ActionMapping, @RenderMapping, @EventListener, @TransactionalEventListener
例如袁铐,來(lái)自spring-test模塊的@ContextConfiguration現(xiàn)在定義如下:
public @interface ContextConfiguration {@AliasFor("locations")String[] value() default {};@AliasFor("value")String[] locations() default {};// ...}
1
2
3
4
5
6
7
8
9
10

1
2
3
4
5
6
7
8
9
10

類似地揭蜒,重寫了元注解屬性的注解現(xiàn)在也可以使用@AliasFor細(xì)粒度地控制那些在注解層次結(jié)構(gòu)中被重寫的屬性。實(shí)際上剔桨,現(xiàn)在可以為元注解的value屬性聲明一個(gè)別名忌锯。

例如,現(xiàn)在可以像下面一樣開發(fā)一種重寫了自定義屬性的組合注解领炫。
@ContextConfigurationpublic @interface MyTestConfig {@AliasFor(annotation = ContextConfiguration.class, attribute = "value")String[] xmlFiles();// ...}
1
2
3
4
5
6
7
8

1
2
3
4
5
6
7
8

參考Spring注解編程模型偶垮。

Spring在發(fā)現(xiàn)元注解的搜索算法上做了很多改進(jìn)。例如帝洪,在注解繼承體系中可以聲明局部的組合注解赁严。
重寫了元注解屬性的組合注解現(xiàn)在可以用在接口矫俺、抽象類、橋接和接口方法上,也可以用在類征讲、標(biāo)準(zhǔn)方法足丢、構(gòu)造方法和字段上脯丝。
代表注解屬性的Map(和AnnotationsAttributes實(shí)例)可以被合成(或者轉(zhuǎn)換)到一個(gè)注解中燎含。
基于字段的數(shù)據(jù)綁定(DirectFieldAccessor)可以與當(dāng)前基于屬性的數(shù)據(jù)綁定(BeanWrapper)一起使用。特別地军援,基于字段的綁定現(xiàn)在支持為集合仅淑、數(shù)據(jù)和Map導(dǎo)航。
DefaultConversionServiceSteam胸哥、Charset涯竟、CurrencyTimeZone提供了可以直接使用的轉(zhuǎn)換器。這些轉(zhuǎn)換器也可以被添加到任意的ConversionService中空厌。
DefaultFormattingConversionService為JSR-354中的貨幣提供了支持(如果javax.money存在于classpath下)庐船,即MonetaryAmountCurrencyUnit。這也包含對(duì)@NumberFormat的支持嘲更。
@NumberFormat現(xiàn)在可以作為元注解使用筐钟。
JavaMailSenderImpl有一個(gè)新的方法testConnection()用于檢查與服務(wù)器間的連接。
ScheduledTaskRegistrar暴露計(jì)劃的任務(wù)赋朦。
Apache的commons-pool2現(xiàn)在支持AOP池CommonsPool2TargetSource篓冲。
為腳本化bean引入了StandardScriptFactory作為一個(gè)基于JSR-223的機(jī)制李破,暴露于XML中的lang:std元素。對(duì)JavaScript和JRuby的支持纹因。(注意:JRubyScriptFactory和lang:jruby現(xiàn)在過時(shí)了喷屋,請(qǐng)使用JSR-223)

5.2 數(shù)據(jù)訪問的改進(jìn)
AspectJ現(xiàn)在支持javax.transactional.Transactional琳拨。
SimpleJdbcCallOperations現(xiàn)在支持命名綁定瞭恰。
全面支持Hibernate ORM 5.0,作為JPA提供者(自動(dòng)適配)狱庇,也支持其原生API(被新的org.springframework.orm.hibernate5包覆蓋)惊畏。
嵌入的數(shù)據(jù)庫(kù)現(xiàn)在可以被自動(dòng)賦值不同的(unique)名字,且<jdbc:embedded-database>支持新的屬性database-name密任。參考下面的“測(cè)試的改進(jìn)”部分颜启。

5.3 JMS的改進(jìn)
autoStartup屬性可以通過JmsListenerContainerFactory控制。
每個(gè)監(jiān)聽器容器都能配置應(yīng)答Destination的類型浪讳。
@SendTo注解的值現(xiàn)在可以使用SpEL表達(dá)式缰盏。
響應(yīng)目標(biāo)可以使用JmsResponse在運(yùn)行時(shí)計(jì)算。
@JmsListener是一個(gè)可重復(fù)性的注解淹遵,可以在同一個(gè)方法上聲明多個(gè)JMS容器(如果你還沒有使用Java 8口猜,請(qǐng)使用新引入的@JmsListeners)。

5.4 Web的改進(jìn)
支持HTTP流和服務(wù)器發(fā)送事件透揣。參考HTTP流济炎。
支持內(nèi)置CORS的全局(MVC Java配置和XML命名空間)和局部(例如,@CrossOrign)配置辐真。參考26 CORS支持须尚。
HTTP緩存更新: 新的創(chuàng)建者CacheControl,嵌入到ResponseEntity, WebContentGenerator, ResourceHttpRequestHandler中侍咱。
WebRequest中改進(jìn)了ETag/Last-Modified的支持耐床。

自定義映射注解,使用@RequestMapping作為元注解楔脯。
AbstractHandlerMethodMapping中的公共方法用于在運(yùn)行時(shí)注冊(cè)和取消注冊(cè)請(qǐng)求映射咙咽。
AbstractDispatcherServletInitializer中的保護(hù)方法createDispatcherServlet進(jìn)一步自定義DispatcherServlet的實(shí)例。
HandlerMethod作為@ExceptionHandler方法的參數(shù)淤年,特別在@ControllerAdvice組件中非常便利钧敞。
java.util.concurrent.CompletableFuture作為@Controller方法的返回類型。
HttpHeaders支持字節(jié)范圍的請(qǐng)求麸粮,并提供靜態(tài)資源溉苛。
@ResponseStatus檢測(cè)嵌套異常。
RestTemplate中的UriTemplateHandler擴(kuò)展點(diǎn)弄诲。 DefaultUriTemplateHandler暴露了baseUrl屬性和路徑段編碼選項(xiàng)愚战。
此擴(kuò)展點(diǎn)可嵌入到URI模板庫(kù)中娇唯。

OkHTTPRestTemplate集成。
自定義的baseUrl可以替代MvcUriComponentsBuilder中的方法寂玲。
序列化/反序列化的異常信息在WARN級(jí)別被記錄塔插。
默認(rèn)的JSON前綴從“{}&&”改成了更安全的”)]}’,”中的一個(gè)(譯者注:此處可能官方文檔有誤)。
新的擴(kuò)展點(diǎn)RequestBodyAdvice和內(nèi)置實(shí)現(xiàn)支持@RequestBody方法參數(shù)上的Jackson的@JsonView拓哟。
使用GSON或Jackson 2.6+時(shí)想许,處理器方法的返回類型被用于改進(jìn)參數(shù)化類型的序列化,比如List<Foo>断序。
引入了ScriptTemplateView作為JSR-223用于處理腳本web視圖的機(jī)制流纹,主要關(guān)注于Nashorn(JDK 8)上的JavaScript視圖模板。

5.5 WebSocket消息處理的改進(jìn)
暴露關(guān)于已連接用戶和訂閱存在的信息违诗。 新的SimpUserRegistry暴露為叫作“userRegistry”的bean漱凝。
在服務(wù)器集群間共享已存在的信息(參考代理中繼配置選項(xiàng))。

解決用戶在服務(wù)器集群中的目的地(參考代理中繼配置選項(xiàng))诸迟。
StompSubProtocolErrorHandler擴(kuò)展點(diǎn)用來(lái)定制和控制STOMP錯(cuò)誤幀到客戶端茸炒。
通過@ControllerAdvice組件聲明的全局方法@MessageExceptionHandler
SpEL表達(dá)式“selector”頭用于SimpleBrokerMessageHandler的訂閱阵苇。
通過TCP和WebSocket使用STOMP客戶端壁公。參考25.4.13 STOMP客戶端
@SendTo@SendToUser可以包含多個(gè)占位符慎玖。
Jackson的@JsonView支持在@MessageMapping@SubscribeMapping方法上返回值贮尖。
ListenableFutureCompletableFuture可以作為@MessageMapping@SubscribeMapping方法的返回值類型。
MarshallingMessageConverter用于XML負(fù)載趁怔。

5.6 測(cè)試的改進(jìn)
基于JUnit的集成測(cè)試現(xiàn)在可以使用JUnit規(guī)則執(zhí)行而不是SpringJUnit4ClassRunner湿硝。這使得基于Spring的集成測(cè)試可以使用替代runner運(yùn)行,比如JUnit的Parameterized或第三方的runner如MockitoJUnitRunner润努。參考Spring JUnit規(guī)則关斜。
Spring MVC測(cè)試框架現(xiàn)在對(duì)HtmlUnit提供了一流的支持,包括集成Selenium的WebDriver铺浇,允許基于頁(yè)面的web應(yīng)用測(cè)試不再需要部署到一個(gè)Servlet容器上痢畜。參考14.6.2, HtmlUnit的集成
AopTestUtils是一個(gè)新的測(cè)試工具類鳍侣,它允許開發(fā)者可以獲取到底層的隱藏在一個(gè)或多個(gè)Spring代理類下的目標(biāo)對(duì)象丁稀。參考13.2.1 通用測(cè)試工具類
ReflectionTestUtils現(xiàn)在支持為static字段設(shè)值和取值倚聚,包括常量线衫。
通過@ActiveProfiles聲明的bean定義配置文件的原始順序現(xiàn)在保留了,這是為了使用一些案例惑折,比如Spring Boot的ConfigFileApplicationListener授账,它通過有效的名稱來(lái)加載配置文件枯跑。
@DirtiesContext現(xiàn)在支持新的模式BEFORE_METHOD, BEFORE_CLASSBEFORE_EACH_TEST_METHOD用于在測(cè)試之前關(guān)閉ApplicationContext——例如,在大型測(cè)試套件中的一些劣質(zhì)的測(cè)試毀壞了對(duì)ApplicationContext的原始配置白热。
@Commit這個(gè)新注解可以直接替代@Rollback(false)敛助。
@Rollback現(xiàn)在可以用來(lái)配置類級(jí)別默認(rèn)的回滾語(yǔ)義。 因此屋确,@TransactionConfiguration現(xiàn)在過時(shí)了纳击,并且會(huì)在后續(xù)版本中移除。

通過statements這個(gè)新的屬性@Sql現(xiàn)在支持內(nèi)聯(lián)SQL語(yǔ)句的執(zhí)行乍恐。
用于在測(cè)試期間緩存應(yīng)用上下文的ContextCache現(xiàn)在是公共的API评疗,它有默認(rèn)的實(shí)現(xiàn)测砂,可以替代自定義的緩存需求茵烈。
DefaultTestContext, DefaultBootstrapContextDefaultCacheAwareContextLoaderDelegate現(xiàn)在是support子包下的公共類,允許自定義擴(kuò)展砌些。
TestContextBootstrappers現(xiàn)在負(fù)責(zé)創(chuàng)建TestContext呜投。
在Spring MVC測(cè)試框架中,MvcResult的詳細(xì)日志現(xiàn)在可以在DEBUG級(jí)別被打印存璃,或者寫出到自定義的OutputStreamWriter中仑荐。參考MockMvcResultHanlder中的新方法log(), print(OutputStream)print(Writer)
JDBC XML的命名空間支持一個(gè)新的屬性database-name纵东,位于<jdbc:embedded-database>中粘招,允許開發(fā)者為嵌入的數(shù)據(jù)庫(kù)設(shè)置不同的名字——例如,通過SpEl表達(dá)式或者被當(dāng)前 有效bean定義 配置文件 影響的屬性文件占位符偎球。
嵌入的數(shù)據(jù)庫(kù)現(xiàn)在可以被自動(dòng)賦予不同的名字洒扎,允許在同一測(cè)試套件不同的應(yīng)用上下文中重復(fù)使用通用的測(cè)試數(shù)據(jù)庫(kù)配置。參考18.8.6 為嵌入的數(shù)據(jù)庫(kù)生成不同的名字衰絮。
MockHttpServletRequestMockHttpServletResponse現(xiàn)在通過getDateHeadersetDateHeader方法提供了更好的支持用于格式化日期頭袍冷。

  1. Spring 4.3的新特性和增強(qiáng)功能
    6.1 核心容器的改進(jìn)
    核心容器提供了更豐富的元數(shù)據(jù)用于編程式評(píng)估。
    Java8的默認(rèn)方法可以作為bean屬性的getter/setter方法被檢測(cè)猫牡。
    如果目標(biāo)bean僅僅定義了一個(gè)構(gòu)造方法胡诗,就不必指定@Autowired注解了。
    @Configuration類支持構(gòu)造方法注入淌友。
    任何用于指定@EventLIstener條件的SpEL表達(dá)式現(xiàn)在可以引用bean了(例如煌恢,@beanName.method())。
    組合注解現(xiàn)在可以重寫元注解的數(shù)組屬性震庭。例如瑰抵,@RequestMappingString[] path可以使用組合注解的String path重寫。
    @Scheduled@Schedules可以作為元注解归薛,用來(lái)創(chuàng)造組合注解并可重寫其屬性谍憔。
    @Scheduled支持任何作用域的bean匪蝙。

6.2 數(shù)據(jù)訪問的改進(jìn)
jdbc:initialize-databasejdbc:embedded-database支持一個(gè)可配置的分隔符應(yīng)用于任何腳本。

6.3 緩存的改進(jìn)
spring 4.3 允許并發(fā)調(diào)用給定的key习贫,從而使得值只被計(jì)算一次逛球。這是一項(xiàng)可選功能,通過@Cacheable的新屬性sync啟用苫昌。這項(xiàng)功能也使Cache接口做了重大改變颤绕,增加了get(Object key, Callable<T> valueLoader)方法。
spring 4.3 也改進(jìn)了以下緩存方面的內(nèi)容:
緩存相關(guān)的注解中的SpEL表達(dá)式現(xiàn)在可以引用bean了(比如祟身,@beanName.method())奥务。
ConcurrentMapCacheManagerConcurrentMapCache現(xiàn)在可以通過新的屬性storeByValue序列化緩存的entry。
@Cacheable, @CacheEvict, @CachePut@Caching現(xiàn)在可以作為元注解袜硫,用來(lái)創(chuàng)造組合注解并可重寫其屬性氯葬。

6.4 JMS的改進(jìn)
@SendTo現(xiàn)在可應(yīng)用于類級(jí)別上,以便共享共同的目標(biāo)婉陷。
@JmsListener@JmsListeners現(xiàn)在可作為元注解帚称,用來(lái)創(chuàng)造組合注解并可重寫其屬性。

6.5 Web的改進(jìn)
內(nèi)置了對(duì)Http頭和Http選項(xiàng)的支持秽澳。
新的組合注解@GetMapping, @PostMapping, @PutMapping, @DeleteMapping@PatchMapping闯睹,它們來(lái)源于@RequestMapping。 參考@RequestMapping的變種担神。

新的組合注解@RequestScope, @SessionScope@ApplicationScope用于web作用域楼吃。 參考Request scope, Session scope和Application scope

新的注解@RestControllerAdvice妄讯,它是@ControllerAdvice@ResponseBody的組合體孩锡。
@ResponseStatus現(xiàn)在可用于類級(jí)別并可以被所有方法繼承。
新的@SessionAttribute注解用于訪問session的屬性捞挥。
新的@RequestAttribute注解用于訪問request的屬性浮创。
@ModelAttribute可以設(shè)置其屬性binding=false阻止數(shù)據(jù)綁定。
錯(cuò)誤和自定義的異称龊可一致地暴露給MVC的異常處理器斩披。
Http消息轉(zhuǎn)換器中一致地處理字符集,默認(rèn)地使用UTF-8處理多部分文本內(nèi)容讹俊。
使用已配置的ContentNegotiationManager處理媒體類型等靜態(tài)資源垦沉。
RestTemplateAsyncRestTemplate可通過DefaultUriTemplateHandler支持嚴(yán)格的URI編碼。
AsyncRestTemplate支持請(qǐng)求攔截仍劈。

6.6 WebSocket消息處理的改進(jìn)
@SendTo@SendToUser現(xiàn)在可應(yīng)用于類級(jí)別上厕倍,以便共享共同的目標(biāo)。

6.7 測(cè)試的改進(jìn)
spring測(cè)試上下文中的JUnit現(xiàn)在需要 4.12 及其更高版本贩疙。
SpringJUnit4ClassRunner的新別名SpringRunner讹弯。
測(cè)試相關(guān)的注解現(xiàn)在可用于接口上况既,從而可以使用Java 8 中接口的默認(rèn)方法。
空聲明的@ContextConfiguration現(xiàn)在可以完全省略了组民,如果默認(rèn)的XML文件棒仍、Groovy腳本或@Configuration類被檢測(cè)到。
@Transactional測(cè)試方法不再必需是public了(例如臭胜,在TestNG和JUnit 5 中)莫其。
@BeforeTransactionAfterTransaction方法不再必需是public了,并且現(xiàn)在也可能用在Java 8 接口的默認(rèn)方法上耸三。
spring測(cè)試上下文中的ApplicationContext緩存現(xiàn)在是有界的乱陡,默認(rèn)最大值為32,并按最近最少原則回收仪壮。其最大值可以通過JVM的系統(tǒng)屬性或spring的屬性spring.test.context.cache.maxSize進(jìn)行設(shè)置憨颠。
用于自定義測(cè)試ApplicationContext的新API ContextCustomizer在bean定義之后且上下文刷新之前被加載到上下文中。Customizer可以通過第三方注冊(cè)睛驳,但需要實(shí)現(xiàn)自定義的ContextLoader烙心。
@Sql@SqlGroup現(xiàn)在可作為元注解膜廊,用來(lái)創(chuàng)造組合注解并可重寫其屬性乏沸。
ReflectionTestUtils現(xiàn)在會(huì)自動(dòng)解除代理當(dāng)set或get一個(gè)字段時(shí)。
服務(wù)器端的springmvc測(cè)試支持響應(yīng)頭帶有多個(gè)值爪瓜。
服務(wù)器端的springmvc測(cè)試解析表單數(shù)據(jù)請(qǐng)求內(nèi)容并填充請(qǐng)求參數(shù)蹬跃。
服務(wù)器端的springmvc測(cè)試支持對(duì)已調(diào)用的處理器方法模擬斷言。
客戶端的REST測(cè)試允許指明希望發(fā)送多少次請(qǐng)求并決定是否請(qǐng)求的順序可被忽略铆铆。
客戶端的REST測(cè)試支持在請(qǐng)求體中添加表單數(shù)據(jù)蝶缀。

6.8 支持新庫(kù)和服務(wù)器
Hibernate ORM 5.2(仍然能很好地支持4.2/4.3和5.0/5.1,但是3.6已經(jīng)過時(shí)了)
Jackson 2.8(至少需要2.6以上版本)
OkHttp 3.x(同時(shí)仍然支持OkHttp 2.x)
Netty 4.1
Undertow 1.4
Tomcat 8.5.2 及 9.0 M6

另外薄货,spring 4.3的spring-core.jar中集成了更新的ASM 5.1和Objenesis 2.4翁都。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谅猾,隨后出現(xiàn)的幾起案子柄慰,更是在濱河造成了極大的恐慌,老刑警劉巖税娜,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坐搔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡敬矩,警方通過查閱死者的電腦和手機(jī)概行,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弧岳,“玉大人凳忙,你說我怎么就攤上這事业踏。” “怎么了涧卵?”我有些...
    開封第一講書人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵堡称,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我艺演,道長(zhǎng)却紧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任胎撤,我火速辦了婚禮晓殊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘伤提。我一直安慰自己巫俺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開白布肿男。 她就那樣靜靜地躺著介汹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舶沛。 梳的紋絲不亂的頭發(fā)上嘹承,一...
    開封第一講書人閱讀 48,954評(píng)論 1 283
  • 那天,我揣著相機(jī)與錄音如庭,去河邊找鬼叹卷。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坪它,可吹牛的內(nèi)容都是我干的骤竹。 我是一名探鬼主播,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼往毡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蒙揣!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起开瞭,我...
    開封第一講書人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤懒震,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惩阶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挎狸,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年断楷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锨匆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恐锣,靈堂內(nèi)的尸體忽然破棺而出茅主,到底是詐尸還是另有隱情,我是刑警寧澤土榴,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布诀姚,位于F島的核電站,受9級(jí)特大地震影響玷禽,放射性物質(zhì)發(fā)生泄漏赫段。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一矢赁、第九天 我趴在偏房一處隱蔽的房頂上張望糯笙。 院中可真熱鬧,春花似錦撩银、人聲如沸给涕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)够庙。三九已至,卻和暖如春抄邀,著一層夾襖步出監(jiān)牢的瞬間耘眨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工撤摸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留毅桃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓准夷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親莺掠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子衫嵌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)彻秆,斷路器楔绞,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評(píng)論 6 342
  • Spring4參考手冊(cè)中文版 作者簡(jiǎn)介 翻譯 鐵柱 wwwshiym@gmail.com 顧問 張丙天 鐵柱 ...
    google666s閱讀 921評(píng)論 0 50
  • 當(dāng)構(gòu)造函數(shù)有2個(gè)相同類型的參數(shù),指定次序可以解決此種情況。注意index是從0開始 記住唇兑,若要使Spring能從構(gòu)...
    google666s閱讀 817評(píng)論 0 48
  • 可能是最后一次給你寫信了 我履行了我的承諾 我有一艘港口最美麗的船 你說你會(huì)用我親手繪畫的船票 在最偉大的船長(zhǎng)面前...
    白森丶閱讀 142評(píng)論 0 0