Spring框架是一個輕量級解決方案,也是構建企業級應用的潛在一站式服務。然而,Spring的模塊化容許你只使用你須要的部分,而沒必要所有引入。你可使用IOC容器搭配其餘web框架,也能夠集成Hibernate或JDBC抽象層。Spring框架支持聲明式事務管理,和經過RMI或web services進行遠程訪問,以及持久化數據的多種選擇。它還提供了一個全功能的MVC框架,同時支持透明的AOP配置。html
Spring的設計是非侵入式的,意味着在集成層(如數據訪問層)你自己的邏輯代碼一般不用依賴框架自己,但對數據訪問技術和Spring庫的一些依賴不可避免。然而這些依賴能夠同你的邏輯代碼輕易地隔離開。前端
本文檔是Spring框架功能的參考指南。若是你對本文檔有任何要求,意見或問題,能夠發送到用戶郵箱列表。關於框架的問題能夠訪問StackOverflow(https://spring.io/questions);java
這篇參考指南提供了關於Spring框架的詳細信息,是包含全部功能的綜合文檔,以及Spring所擁護的基本概念(如依賴注入)的一些背景知識。web
若是你剛接觸Spring,能夠經過建立一個Spring Boot應用來開始使用Spring框架。Spring Boot提供了一種快速的(和全配置的)方式來建立一個生產級的Spring應用。它基於Spring框架,遵循一些配置慣例,旨在讓你的應用快速運行起來。算法
你可使用start.spring.io來生成一個基本的工程,或者參考入門指南中一個,好比構建RESTful Web Service入門。除了很容器理解,這些指南都是任務方式的,其中大部分也都是基於Spring Boot的。它們還涵蓋了Spring解決方案中你可能考慮解決特定問題的其餘項目。spring
Spring框架是一個Java平臺,爲開發Java應用程序提供全面的基礎設施支持。Spring接管了基礎設施,以便你能夠專一於你的應用。數據庫
Spring使你可以使用普通的Java對象(POJO)構建應用程序,並將企業服務非侵入式地應用於POJO。此功能適用於Java SE編程模型以及完整和部分Java EE。express
做爲一個應用開發着,你能夠從Spring平臺受益如下內容:apache
Java應用程序——從受限的嵌入式應用程序到n層服務器端企業應用程序運行範圍的寬鬆術語一般由協做造成應用程序的對象組成。於是應用程序中的對象互相依賴。編程
雖然Java平臺提供了豐富的應用程序開發功能,但它缺少將基本組織成總體的方法,將該任務留給架構師和開發人員。雖然你可使用工廠(Factory),抽象工廠(Abstract Factory),建造者(Builder),裝飾器(Decorator),服務定位(Service Locator)等設計模式來組合構成應用程序的各類類和對象實例,但這些模式只有簡單的說明:模式的名稱,描述,應用於哪裏以及能解決哪一種問題等等。而你必須本身在應用中將模式的最佳實踐付諸實施。
Spring框架控制反轉(IOC)組件提供將不一樣組件組成完整的可以使用的應用程序的實踐方法。 Spring框架將形式化的設計模式做爲首要的對象集成到應用程序進行編譯。許多組織機構以這種方式使用Spring框架來設計強大的可維護的應用程序。
背景知識 Martin Fowler2004年在他的網站中提出關於控制反轉(IOC)的問題:"問題是,反轉的是什麼方面的控制"。Fowler建議從新命名規則,使其更加自明,並提出依賴注入。
Spring框架由大約20個模塊功能組成,這些模塊能夠分紅核心容器(Core Container),數據訪問/集成(Data Access/Integration),Web,AOP(Aspect Oriented Programming),設備(Instrumentation)、,消息發送(Messaging),和測試(Test)幾個部分,具體以下圖所示。
如下部分列出了每一個功能的可用模塊同產品名稱及其涵蓋的主題。產品名稱與依賴管理工具(Dependency Management tools)的產品id相關聯。
核心容器由spring-core
,spring-beans
,spring-context
,spring-context-support
,和spring-expression
(Spring表達式語言)模塊組成。
spring-core
和spring-beans
模塊提供了框架的基礎部分,包含控制反轉和依賴注入。BeanFactory
是工廠模式的一個複雜實現。它消除了對單例編程化的須要並容許你將依賴關係的配置和規範與實際程序邏輯相分離。
上下文(spring-context
)模塊創建在由Core和Beans模塊提供的實體基礎上:它是以相似JNDI註冊表的框架式方式訪問對象的一種手段。上下文模塊從Beans模塊繼承其功能,並增長對國際化的支持(如使用資源組),事件傳播,資源加載和上下文的透明建立,好比Servlet容器。上下文模塊也支持JavaEE的功能,諸如EJB,JMX和基本遠程調用。ApplicationContext接口是上下文模塊的焦點。spring-context-support
支持常見的第三方庫集成到Spring應用程序環境中,特別是緩存(EhCache,JCache)和調度(CommonJ,Quartz)。
spring-expression
模塊提供了強大的表達式語言,用於在運行時查詢和操做對象圖。它是JSP2.1規範中規定的統一表達語言(統一EL)的擴展。該語言支持設置和獲取屬性值,屬性分配,方式調用,訪問數組,集合和索引器的內容,邏輯和算術運算符,命名變量以及從Spring的IOC容器中以名稱檢索對象。它還支持列表投影和選擇以及常見列表聚合。
spring-aop
模塊提供了符合AOP聯盟的面向切面編程的實現,容許你定義方法攔截器和切入點,以便乾淨地解除那些實現了應該分離的功能的代碼。使用源碼級元數據功能,你還能夠將行爲信息合併到代碼中,相似於.NET的屬性的方式。
單獨的spring-aspects
模塊提供與AspectJ的集成。
spring-instrument
模塊提供了類級別的設備支持和能夠在某些應用服務裏使用的類加載器級別的實現。spring-instrument-tomcat
模塊包含了Tomcat的spring設備代理。
Spring4框架包含一個spring-messaging
模塊,其中包含來自Spring Integration項目(如Message
,MessageChannel
,MessageHandler
)的關鍵抽象,以及基於消息的應用的基礎的其餘部分。模塊還包含了映射消息到方法的註解集合,相似Spring MVC基於編程方式的註解。
數據訪問/集成層包含了JDBC、ORM、OXM、JMS和事務模塊。
spring-jdbc
模塊提供了JDBC抽象層,再也不須要處理繁雜的JDBC編碼以及數據庫供應商特定錯誤碼的解析。
spring-tx
模塊支持爲實現指定接口的類以及全部POJOs(普通Java對象)的編程和聲明式事務管理。
spring-orm
模塊爲流行的對象關係映射APIs提供集成層,包括JPA和Hibernate。經過spring-orm
模塊,你能夠將O/R映射框架組合Spring提供的其餘功能一塊兒使用,好比前面說起的簡單聲明式事務管理功能。
spring-oxm
模塊爲Object/XML映射實現提供抽象層,諸如JAXB,Castor,JiBX和XStream。
spring-jms
模塊(Java消息服務)包含生產和消費消息的功能。從Spring框架4.1版本開始,它提供與spring-messaging
模塊的集成。
Web層包含spring-web
,spring-webmvc
和spring-websocket
模塊。
spring-web
模塊提供基礎的面向web的集成功能,支持多文件上傳功能,以及經過Servlet監聽器和麪向web的應用上下文初始化IOC容器。同時還包含HTTP客戶端和Spring遠程支持的web相關部分。
spring-webmvc
模塊(也稱爲Web-Servlet模塊)包含支持web應用的Spring模型-試圖-控制(MVC)和REST風格的web服務實現。Spring的MVC框架提供了域模型代碼(domain model code)和Web表單的清晰分離,並與Spring框架全部其餘功能相集成。
spring-test
模塊支持使用JUnit或TestNG進行Spring組件的單元測試或集成測試。它提供了Spring ApplicationContexts的一致加載和緩存。同時提供用於隔離測試的模擬對象(mock objects)。
前面描述的構件塊使得Spring成爲許多場景中的合理選擇,從在資源受限設備上運行的嵌入式應用程序到使用Spring事務管理功能和Web框架集成的全面的企業應用程序。
圖2.2 典型的成熟的Spring web應用程序
Spring的聲明式事務管理功能支持web應用程序全事務化,就同你使用EJB容器管理的事務同樣。全部你的定製業務邏輯均可以由簡單的POJOs實現,並由Spring IoC容器管理。其餘服務包括髮送email和獨立於web層的校驗,而你能夠選擇何處去執行校驗規則。Spring的ORM支持同JPA和Hibernate的整合,好比,當你使用Hibernate時,能夠保持原有的映射文件及標準Hibernate SessionFactory
配置。表單控制器無縫整合了web層和域模型,無需那些轉換HTTP參數到域模型的ActionForms
或其餘類。
圖2.3 Spring中間層使用第三方web框架
有時狀況並不容許你徹底切換到一個不一樣的框架。Spring框架不是一個要麼使用所有特性要麼什麼都用不了的解決方案,不強制使用其中的每一個功能。現存的前端如Struts,Tapestry,JSF或其餘UI框架均可以同基於Spring的中間層整合在一塊兒,從而使你能過使用Spring事務功能。你只須要使用ApplicationContext
鏈接你的業務邏輯以及經過WebApplicationContext
整合你的web層。
圖2.4 遠程調用使用場景
你可使用Spring的Hessian-
,Rmi-
或HttpInvokerProxyFactoryBean
類來經過web服務訪問現存的代碼。遠程訪問現存應用程序並不困難。
圖2.5 EJBs-包裝現存POJOs
Spring框架還爲企業JavaBeans提供了一個訪問抽象層,使你可以重用現有的POJO,並將其包裝在無狀態會話bean中,以便在可能須要聲名式安全的可擴展,故障安全的web應用程序中使用。
依賴管理不一樣於依賴注入。要在你的應用程序中使用Spring的這些功能(好比依賴注入),須要 組合須要的庫(jar包),並在運行時將其置於classpath下,編譯時也儘量這樣作。這些依賴並非要注入的虛擬組件,而是文件系統中的資源(一般狀況下)。依賴管理的過程包括資源定位,資源存儲並將其置於classpath。依賴多是直接的(好比運行時應用依賴於Spring的)和間接的(如應用中依賴commons-dbcp,而它又依賴於commons-pool)。間接的依賴每每是「過渡的」,而這些依賴是最難去識別和管理的。
若是你將要使用Spring,你須要拷貝一份包含你所須要的Spring部分的jar包。爲了讓這種操做更加容易,Spring被打包成一組模塊,而且儘量地分離依賴關係,於是好比當你不想寫一個web應用程序時,就沒必要用spring-web模塊。在本指南中引用Spring庫模塊,咱們使用簡要命名約定spring-*
或者spring-*.jar
,*表明模塊的簡寫(如spring-core
,spring-webmvc
,spring-jms
等)。你使用的真實jar包文件名一般是模塊名拼上版本號(如spring-core-5.0.0.M5.jar)。
Spring框架的每一個release版都會發布到如下地方:
spring-*-<version>.jar
的形式,而Maven groupId是org.springframework
。所以你須要決定的第一件事就是怎麼管理你的依賴:咱們一般推薦使用自動化系統,好比Maven,Gradle或Ivy,可是你也能夠手工下載全部jar包。
你將在下面找到Spring的工件列表。更多詳細的模塊描述,請見2.2節模塊。
表2.1.Spring框架工件
GroupId | ArtifactId | Description |
---|---|---|
org.springframework | spring-aop | 基於代理的AOP支持 |
org.springframework | spring-aspects | 基於AspectJ的面向切面 |
org.springframework | spring-beans | Beans支持,包括Groovy |
org.springframework | spring-context | 運行時應用上下文,包括調度和遠程抽象 |
org.springframework | spring-context-support | 支持類將經常使用第三方庫集成到Spring應用程序上下文中 |
org.springframework | spring-core | 核心工具,被許多其餘Spring模塊所依賴 |
org.springframework | spring-expression | Spring表達式語言 |
org.springframework | spring-instrument | JVM自帶的設備代理 |
org.springframework | spring-instrument-tomcat | Tomcat的設備代理 |
org.springframework | spring-jdbc | JDBC支持包,包括數據源啓動和JDBC訪問支持 |
org.springframework | spring-jms | JMS支持包,包括髮送和接收JMS消息的幫助類 |
org.springframework | spring-messaging | 支持消息架構和協議 |
org.springframework | spring-orm | 對象關係映射,包含JPA和Hibernate支持 |
org.springframework | spring-oxm | 對象和XML映射 |
org.springframework | spring-test | Spring組件的單元測試和集成測試支持 |
org.springframework | spring-tx | 事務基礎設施,包含DAO支持和JCA整合 |
org.springframework | spring-web | Web支持包,包含客戶端和web遠程調用 |
org.springframework | spring-webmvc | REST風格web服務和web應用的MVC實現 |
org.springframework | spring-websocket | WebSocket和SockJS的實現,包含STOMP支持 |
儘管Spring提供了大量企業和其餘外部工具的整合和支持,可是仍是有意將強制性的依賴減小到最小:你沒必要爲了使用Spring建立簡單的用例而尋找和下載大量的jar包(儘管是自動的)。基本的依賴注入只有一個強制的外部依賴,就是日誌(關於日誌的詳細描述見下方)。
接下來咱們歸納一下依賴於Spring的應用配置的基本步驟。首先是使用Maven,而後是Gradle,最後是Ivy。任何狀況下,若是有不清楚的地方,參考依賴管理系統的文檔,或者一些樣例代碼。Spring自身使用Gradle管理依賴來構建,而咱們的樣例大多數使用Gradle或Maven。
若是你使用Maven做爲依賴管理,沒必要明確地提供日誌依賴。好比,建立一個應用上下文並使用依賴注入配置一個應用程序,你的Maven依賴應該像這樣:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.0.M5</version> <scope>runtime</scope> </dependency> </dependencies>
就是這樣。注意若是你不須要像一般基本依賴注入的用例同樣,編譯Spring API,就能夠將scope聲明爲runtime。
Maven的中心庫支持上面的例子。若是要使用Spring Maven庫(如里程碑或開發快照版本),你須要在Maven配置中指定資源庫的位置。支持全部release:
<repositories> <repository> <id>io.spring.repo.maven.release</id> <url>http://repo.spring.io/release/</url> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories
支持里程碑:
<repositories> <repository> <id>io.spring.repo.maven.milestone</id> <url>http://repo.spring.io/milestone/</url> <snapshots><enabled>false</enabled></snapshots> </repository> </repositories>
支持快照:
<repositories> <repository> <id>io.spring.repo.maven.snapshot</id> <url>http://repo.spring.io/snapshot/</url> <snapshots><enabled>true</enabled></snapshots> </repository> </repositories>
使用Maven時意外混合Spring的多個版本是頗有可能的。好比,你可能發現一個第三方庫或其餘的Spring工程,引用了一箇舊版本。若是你忘記明確地聲明依賴版本,各類意想不到的問題就會出現。
爲了解決此類問題,Maven提供了「物料清單」(BOM)依賴的概念。你能夠在dependencyManagement
塊中導入spring-framework-bom
,來確保全部spring依賴(直接或間接的)都處於同一版本中。
<dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>5.0.0.M5</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
使用BOM的另外的好處是當你依賴於Spring框架時,沒必要再指定version屬性。
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> </dependency> <dependencies>
經過Gradle構建系統使用Spring資源庫,在repositories
塊中設置適當的URL:
repositories { mavenCentral() // 可選的 maven { url "http://repo.spring.io/release" } }
你能夠根據須要改變repositories
的URL,從/release
到/milestone
或/snapshot
。資源庫配置後,你可使用一般的Gradle方式聲明依賴:
dependencies { compile("org.springframework:spring-context:5.0.0.M5") testCompile("org.springframework:spring-test:5.0.0.M5") }
若是你喜歡使用Ivy管理依賴,也是類似的配置操做。
在你的ivysettings.xml
中添加以下的resolver來配置Ivy指定Spring資源庫:
<resolvers> <ibiblio name="io.spring.repo.maven.release" m2compatible="true" root="http://repo.spring.io/release/"/> </resolvers>
你能夠根據須要改變root
URL從/release
到/milestone
或/snapshot
。
配置後,按照一般的方式添加依賴。以下ivy.xml
:
<dependency org="org.springframework" name="spring-core" rev="5.0.0.M5" conf="compile->runtime"/>
儘管使用支持依賴管理的構建系統來獲取Spring是推薦的方式,然而也能夠直接下載分發的Zip文件。
分發zip包被髮布在Spring的Maven庫中。(這只是咱們圖方便的方式,沒必要經過Maven或其餘構建系統來下載它)。
要下載一個分發zip包,打開瀏覽器訪問http://repo.spring.io/release/org/springframework/spring ,選擇適合版本的子文件夾。分發文件以-dist.zip
結尾,好比spring-framework-{spring-version}-RELEASE-dist.zip。發佈的也包括里程碑和快照版本。
日誌對於Spring是一個很是重要的依賴,由於a)它是惟一強制性的外部依賴,b)每一個人都喜歡看到他們使用的工具備一些輸出,c)Spring整合的許多其餘工具也須要選擇日誌依賴。應用開發者的目標之一每每就是爲整個應用再某個中央位置統一日誌配置,包括全部外部的組件。因爲太多的日誌框架於是經常比較困難。
Spring強制的日誌依賴是Jakarta Commons Logging API (JCL)。咱們編譯JCL並使JCL的Log對象對於繼承Spring框架的類可見。Spring全部版本使用相同的日誌庫對於用戶來講很是重要:遷移很容易,由於繼承自Spring的應用程序都保留向後的兼容性。咱們要作的就是使Spring的一個模塊明確地依賴commons-logging
(JCL的規範實現),而後其餘全部的模塊在編譯期依賴於這個模塊。假如你正在使用Maven,想知道哪裏依賴了commons-logging
,那麼它明確地來自Spring的核心模塊spring-core
。
commons-logging
很棒的是你不須要作任何事就可讓你的應用跑起來。它有一個運行時發現算法,來尋找classpath上約定位置上的其餘日誌框架並選擇一個適宜的來使用(或者你能夠指定一個你須要的)。若是沒有找到可用的,默認會使用JDK(java.util.logging,簡稱JUL)生成好看的日誌。你會發現你的Spring應用工做起來,並且大多數狀況下控制檯都輸出了日誌,這一般是很重要的。
不幸的是,commons-logging
的運行時發現算法雖然對終端用戶很方便,可是是有問題的。若是時間能夠倒流,從新再作Spring項目的話,將會使用另一個日誌依賴。而首選的可能就是Simple Logging Facade for Java ( SLF4J),人們在應用中同Spring一塊兒使用的許多其餘工具也使用它。
有兩種方式能夠替換commons-logging:
spring-core
模塊中排除這個依賴(由於這是惟一明確依賴commons-logging
的模塊)commons-logging
替換成一個空的jar包,而後依賴這個特殊的commons-logging
(詳細見SLF4J FAQ)要排除commons-logging,在你的dependencyManagement
塊中增長如下內容:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.M5</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
如今應用由於classpath下沒有JCL API的實現而可能沒法啓動,於是須要一個新的日誌框架。下一節咱們將使用SLF4J做爲例子展現如何提供一個可選的JCL實現。
SLF4J相較於commons-logging
在運行時更乾淨也更高效,由於它使用編譯期綁定來集成其餘日誌框架,替換了運行時發現的方式。這也就意味着你必須明確地清楚在運行時你想要的,而後相應地聲明或配置。SLF4J提供了對許多經常使用的日誌框架的綁定,於是你每每能夠選擇以前使用的來綁定,從而獲得配置和管理。
SLF4J提供與許多經常使用日誌框架的綁定,包括JCL,而且還提供了相反的方式:介於其餘日誌框架和本身的橋樑。所以在Spring使用SLF4J你須要用SLF4J-JCL橋樑來替代commons-logging
依賴。而後Spring內部的日誌調用將會被轉換爲SLF4J API的日誌調用,所以若是應用中的其餘庫也使用這個API,你就能夠在一個惟一的地方來配置和管理日誌。
一個經常使用的選擇是鏈接Spring和SLF4J,並提供從SLF4J到Log4j的明確綁定。你須要提供幾個依賴(以及排除已存在的commons-logging
):Log4j的SLF4J實現橋樑和Log4j實現本身。Maven中你能夠配置以下:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.0.0.M5</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.7.22</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency> </dependencies>
看上去獲取一些日誌須要配置不少依賴。是的,可是可選的。對於類加載器問題,它應該比vanilla commons-logging
更好,特別是若是你處於像OSGi平臺這樣的嚴格容器中。 據稱它有更好的性能,由於它的綁定做用於編譯期而非運行時。
一種相對於SLF4J用戶更經常使用的選擇是直接綁定到Logback,使用更少的步驟和產生更少的依賴。因爲Logback直接實現了SLF4J,因此移除了額外的綁定步驟,你只須要依賴於兩個庫而再也不是四個(jcl-over-slf4j
和logback
)。若是你這樣作,你須要從其餘外部的依賴(非Spring)排除slf4j-api依賴,由於你但願classpath上的API只有一個version。
Log4j 1.x項目結束了,接下來應用的是Log4j 2
不少人使用Log4j做爲配置和管理日誌的框架。它高效且成熟,實際上咱們在編譯和測試Spring的運行時也在使用。Spring也提供配置和初始化Log4j的一些工具,在一些模塊有可選的Log4j編譯期依賴。
想經過JCL使用Log4j,全部你要作的就是將Log4j放到classpath下並提供一個配置文件(log4j2.xml,log4j2.properties或其餘支持的配置格式)。對於Maven用戶,最簡要的配置以下:
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.7</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-jcl</artifactId> <version>2.7</version> </dependency> </dependencies>
若是你但願使用SLF4J,下面的依賴也須要:
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.7</version> </dependency> </dependencies>
下面是控制檯日誌配置的log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Logger name="org.springframework.beans.factory" level="DEBUG"/> <Root level="error"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
許多人在其自己提供JCL實現的容器中運行他們的Spring應用程序。IBM Websphere應用服務器(WAS)就是這樣。這每每引發問題,不幸的是沒有終極解決方案;大多數狀況下,簡單地從你的應用中排除commons-logging是不夠的。
要清楚一點:報告的問題一般不是與JCL自己相關,甚至和commons-logging也沒有關係,而是與commons-logging綁定到另外一個框架(一般是Log4j)有關。由於commons-logging更改了一些容器中的舊版本(1.0)和大多數人如今使用的現代版本(1.1)之間執行運行時發現的方式可能會致使失敗。Spring不使用JCL API的任何非通用部分,因此不會有什麼問題。可是一旦Spring或你的應用嘗試執行任何日誌記錄,你會發現與Log4j的綁定不生效。
這種狀況下,使用WAS最簡單的方法是反轉類加載器層次結構(IBM稱爲「parent last」),以便應用控制JCL依賴關係,而非容器。該選項並不老是開放的,但在公共領域還有喝多其餘建議可供選擇,你的方案可能因容器的確切版本和功能集而不一樣。