Spring 2.5 中的註解式 Web MVC 控制器

工程 | Juergen Hoeller | 2007年11月14日 | ...

Spring 2.5 引入了一種編寫註解式 Web MVC 控制器的方法,對此我們還沒有太多博文介紹……我將藉此機會向您概述當下 Spring MVC 的真正意義所在。

Spring MVC 本質上是一個請求分發器框架,具有 Servlet API 變體和 Portlet API 變體。它在其託管環境(無論是 Servlet 還是 Portlet)中非常緊密地執行。可以將 Spring MVC 視為在 Servlet/Portlet 容器之上提供基礎功能和便利性:例如靈活的請求對映、控制器之間的分離……

對 EJB 3 與 Spring 比較分析的回應

工程 | Mark Fisher | 2007年11月9日 | ...

昨晚我參加了新英格蘭 Java 使用者組 (NEJUG) 的一個會議,Reza Rahman 在會上介紹了 EJB 3 與 Spring 的“比較分析”。Reza 是 《EJB 3實戰》一書的作者之一。我很享受與 Reza 的會面,並敬佩他 प्रस्तुत了一個可能被認為是爭議性的話題。我也很欣賞他試圖探討 EJB 3 和 Spring 的優缺點。然而,我感到有必要澄清他關於 Spring 的報道中並非完全準確的一些觀點,這些觀點讓我(以及其他與會者)認為他的演講帶有偏向 EJB 3 的傾向。公平地說,與固定的規範版本不同,Spring 在不斷發展,我在此指出的一些內容是新功能。另一方面,有些是 Spring 2.0 的功能,已經有一年多的時間了。我個人認為,“比較分析”必須考慮被比較產品最新穩定版本的最新功能集。毋庸置疑,我也可能有點偏頗,但我在這裡的目的是提供完全客觀的回應,以便演講或許可以修改得更像“同類比較”。我將對演講中的 10 個“主題”提供簡要回應。

1. EJB 使用註解處理元資料。Spring 使用 XML。

提到 Spring 開始支援更多註解,但這“還需要一段時間”。然而,Spring 2.0 版本提供了完整的 JPA 整合,使用 @PersistenceContext 注入 EntityManager,並使用 Spring 的 @Transactional 註解實現註解驅動的事務管理(支援與具有預設傳播 REQUIRED 的 @Stateless EJB 相同的語義)。我特別沮喪的是,比較並未在雙方都包含 JPA(參見下面的第 3 點)。Spring 2.0 還引入了完整的基於註解的 AspectJ 支援(@Aspect、@Before、@After、@Around)和“stereotype”註解的概念。例如,@Repository 註解為直接使用 JPA 或 Hibernate API(無需 Spring 的模板)的資料訪問程式碼提供了非侵入性異常轉換。Spring 甚至早在 1.2 版本就提供了註解支援,例如 @ManagedResource 用於將任何 Spring 管理的物件透明地匯出為 JMX MBean。

現在,對我來說,這個問題之所以排在第一位,主要是因為評論說這“還需要一段時間”。作為 Spring 2.5 註解驅動配置支援的主要開發者之一,我必須說 Spring 的元資料模型非常靈活,因此我們能夠比預想的更快地提供一個全面的基於註解的模型。事實上,Spring 2.5 提供了對 JSR-250 註解的支援:@Resource、@PostConstruct 和 @PreDestroy,以及 @WebServiceRef 和 @EJB。特別值得關注的是 @Resource,因為它是 EJB 3 中用於依賴注入的主要註解。在 Spring 中,@Resource 註解不僅支援 JNDI 查詢(與 EJB 3 一樣),還支援注入 任何 Spring 管理的物件。這有效地將本次演講中提到的 Spring 主要優勢(Spring 支援任何型別物件的 DI)與 EJB 3 的主要優勢(使用註解而非 XML)結合起來。Spring 2.5 還引入了基於 @Autowired 和(可擴充套件的)@Qualifier 註解的更細粒度的註解驅動依賴注入模型。Spring 2.5 還將“stereotype”註解擴充套件到包括 @Service 和 @Controller。每個 stereotype 註解都透過將其作為元註解應用來擴充套件通用的 @Component 註解。透過應用相同的技術,@Component 註解為使用者定義的 stereotypes 提供了一個擴充套件點。Spring 甚至可以自動檢測這些帶註解的元件,作為 XML 配置的替代方案。例如,這段摘錄來自 PetClinic 示例應用的 2.5 版本


   <context:component-scan base-package="org.springframework.samples.petclinic.web" />

Web 控制器無需額外的 XML 配置,因為它們使用註解驅動的依賴注入和請求對映的註解。我之所以指出這一點,是因為演講特別強調了 Web 層配置的冗長性


@Controller
public class ClinicController {

   private final Clinic clinic;

   @Autowired
   public ClinicController(Clinic clinic) {
      this.clinic = clinic;
   }
   ...

有關 Spring 註解支援的最新資訊,請參閱:The Server Side 上的 Spring 2.5 介紹,或 Spring 參考手冊的最新版本——特別是基於註解的配置部分。此外,請繼續關注本部落格和Spring Framework 主頁,以獲取即將釋出的關於 2.5 版本的文章和部落格。

2. Spring 允許您支援多種部署環境,但需要更多配置。

這一點實際上被作為 Spring 的一個優勢提出,但重點強調了配置開銷。事實是,任何認真對待測試和敏捷開發的專案都需要支援“多種部署環境”。換句話說,這個特定話題常常被歪曲,好像只適用於多種生產環境。實際上,在每個開發和測試周期都必須部署到應用伺服器是敏捷性的主要障礙。通常 Spring 使用者會模組化他們的配置,使得“基礎設施”配置(例如 DataSource、TransactionManager、JMS ConnectionFactory)是獨立的,並且動態屬性是外部化的。由於 Spring 支援根據外部屬性替換 '${placeholders}',因此包含不同的屬性檔案通常會成為一個透明的問題。

3. EJB 使用 JPA,Spring 使用 Hibernate

我必須承認,這一點最讓我困擾。在比較幻燈片中,EJB 3 的示例顯示使用 JPA 透過 entityManager 進行資料訪問,並且 entityManager 例項是透過 @PersistenceContext 註解提供的。另一方面,Spring 的示例使用了 Hibernate,並顯示了 Hibernate SessionFactory 的 Setter 注入。在我看來,這違反了真正的“比較分析”的第一條規則:使用比較雙方中最相似的可用功能。在這種特殊情況下,Spring 確實支援直接使用 JPA API(即 JpaTemplate 是完全可選的;直接使用 'entityManager' 仍然參與 Spring 事務等),並且 Spring 也識別 @PersistenceContext 註解。此支援自 Spring 2.0 釋出以來就已提供(最終版本已有一年多),所以我不知道為什麼比較在 Spring 端沒有使用 JPA。比較的其他部分顯然基於 Spring 2.0,因此這給人一種選擇性過時並暴露偏見的印象。如果這個特定的示例被修改為“同類比較”,它就會破壞主要的總體主題之一:Spring 需要更多配置,而 EJB 3 依賴標準註解。

現在,儘管我認為在 Spring 端使用 Hibernate 而非 JPA 扭曲了比較,但它同時揭示了 Spring 的一個優勢。如果您確實想直接使用 Hibernate API 而不是依賴 JPA API,Spring 可以實現這一點,並且在 Spring 事務管理和異常轉換方面以一致的方式進行。這就有機會使用超越 JPA 限制的 Hibernate 功能,例如 Hibernate 的“criteria”查詢 API。同樣,如果您想在 ORM 過度的情況下新增一些直接 JDBC 進行資料訪問,Spring 也支援這一點——即使在與 Hibernate 或 JPA 資料訪問相同的事務中呼叫。

4. Spring 不做任何假設,您必須提供配置。

一個具體的例子是事務管理器的定義。有人說您必須瞭解容器供應商級別的事情才能配置 Spring 整合。這是不正確的。例如,以下 Bean 定義不包含任何容器特定資訊,但 Spring 會在所有 Java EE 應用伺服器中自動檢測事務管理器


   <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>

如果您確實想利用容器特定的功能,例如每個事務的隔離級別,那麼 Spring 也提供了一些專門的實現:WebLogicJtaTransactionManagerWebSphereUowTransactionManagerOC4JJtaTransactionManager。在這些實現之間切換隻需更改這一個定義。

此外,Spring 的配置幻燈片過於冗長。我擔心這可能也是為了強調 EJB 與 Spring 不同,依賴智慧預設值的目標所致。例如,幻燈片顯示


   <tx:annotation-driven transaction-manager="transactionManager"/>

實際上,如果在 Spring 上下文中只定義了一個 'transactionManager',那麼 'annotation-driven' 元素上就不需要顯式提供該屬性。該屬性僅用於在必要在一個應用程式中使用多個事務管理器。這些“自動檢測”和“智慧預設”技術適用於 Spring 的方方面面,例如訊息監聽器的 JMS 'connectionFactory'(在下面的第 6 點示例中是隱含的)以及自動定位現有的 MBean 伺服器或 RMI 登錄檔。

值得一提的是,Spring 允許“本地”事務管理這一點被認為是一個優勢。雖然 EJB 需要 JTA 進行事務管理,但許多應用程式不需要跨支援兩階段提交的資源的分散式事務。在這種情況下,Spring 允許使用開銷更簡單的事務管理器:DataSourceTransactionManager(用於 JDBC)、HibernateTransactionManager 或 JpaTransactionManager。如果目標是準確描述優缺點,我本以為會聽到更多關於 Spring 這一特定優勢的細節。例如,這對於在容器外部進行測試或在 Eclipse 或 IDEA 等輕量級 IDE 環境中進行開發來說是一個巨大的好處。

此外,如果您確實需要 JTA 進行分散式事務,但想在 Tomcat 或 Jetty 等輕量級容器中執行,Spring 輕鬆支援 Atomikos 和 JOTM 等獨立的 JTA 提供程式。當然,Spring 的事務管理器設定需要配置一個單一的 Bean 定義,但這確實是一次性成本——並且非常值得受益。

5. Spring 沒有有狀態應用正規化。

無狀態服務層的好處作為最佳實踐已經相當成熟,Spring 也擁抱了這一點。然而,Spring 確實提供了除單例之外的其他作用域。Spring 的“prototype”作用域為每次注入或查詢提供一個獨立的例項,並且 Spring 2.0 引入了 Web 作用域:“request”和“session”。作用域機制本身甚至是可以擴充套件的;可以將自定義作用域定義並對映到會話的概念。Spring 還透過 CommonsPoolTargetSource 支援簡單的物件池化,但物件池化很少是狀態管理的最佳解決方案。

更重要的是,Spring 透過 Spring Web Flow 為 Web 應用提供了非常健壯、高度可配置的狀態管理。在 Spring Web Flow 中,會話狀態是透明管理的,這與本次演講中聲稱開發者必須直接與 HTTP Session 互動來管理 Spring 應用中的狀態不同。此外,儲存庫配置是可插拔的,因此可以使用各種策略來物理儲存狀態(session、客戶端、後端快取等)。最後,Spring Web Flow 的最新發展包括對擴充套件持久化上下文的支援以及與 JSF 的完全整合支援。

6. Spring 需要為每個 MessageListener 配置一個容器。

Spring 2.5 提供了一個新的 'jms' 名稱空間,極大地簡化了訊息監聽器的配置。請注意,每個監聽器沒有獨立的容器配置。多個監聽器共享配置,並廣泛使用智慧預設值


<jms:listener-container>
	<jms:listener destination="queue.confirm" ref="logger" method="log"/>
	<jms:listener destination="queue.order…

下載“Spring 在生產環境”白皮書

工程 | Adrian Colyer | 2007年11月9日 | ...

我們最近舉辦了一場以“Spring 在生產環境”為主題的網路研討會。當時我承諾將研討會錄影和配套幻燈片放在我們的網站上。不幸的是,為我們製作研討會的工程師忘記設定“記錄”標誌了,所以我需要為您重新錄製會話 :(. 我目前正在出差,但我會盡快嘗試完成併發布它。

好訊息是,您在此期間無需錯過。我寫了一篇關於“Spring 在生產環境”主題的白皮書,涵蓋了研討會中的內容以及更多內容……

Spring Java 配置向前發展

工程 | Rod Johnson | 2007年11月5日 | ...

一些使用者詢問我們是否致力於 Spring Java 配置,以及它與 Spring 2.5 中引入的註解配置選項的關係。答案是肯定的,我們致力於 Java Config;這兩種方法並非互斥。

這兩種配置方法截然不同:Spring Framework 中的 @Autowired 註解使用業務物件中的註解配置元件,而 Spring Java Config 採用了一種獨特的方法,將註解外部化到專門的配置類中。這兩種方法都沒有絕對的正確性……

Spring LDAP 1.2 釋出

釋出 | Mattias Arthursson | 2007年10月31日 | ...

親愛的 Spring 社群,

我們很高興宣佈 Spring LDAP 1.2 版本釋出。這是一個主要版本,引入了許多新功能和錯誤修復。

            下載 | 變更日誌 | 文件 (HTML) | 文件 (PDF) | API

重要變更摘要

  • SimpleLdapTemplate 和 ParameterizedContextMapper 類現在提供 Java 5 泛型支援。
  • 客戶端 LDAP 事務。
  • 增加了幾個 API 方法,簡化了許多常見任務。

關於 Spring LDAP
Spring LDAP 是一個基於 Spring 的 JdbcTemplate 模式的 Java 庫,用於簡化 LDAP 操作。該框架減輕了使用者查詢和關閉上下文、遍歷 NamingEnumerations、編碼/解碼值和過濾器等工作的負擔。

LdapTemplate 類封裝了傳統 LDAP 程式設計中的所有底層工作,例如建立、遍歷 NamingEnumerations、處理異常和清理資源。這讓程式設計師可以處理重要的事情——在哪裡查詢資料(DNs 和 Filters)以及如何處理資料(對映到領域物件和從領域物件對映、繫結、修改、解綁等),就像 JdbcTemplate 解除了程式設計師除實際 SQL 以及資料如何對映到領域模型之外的所有負擔一樣。

此外,Spring LDAP 提供從 NamingExceptions 到映象的、未經檢查的異常層次結構的異常轉換,以及用於處理過濾器、LDAP 路徑和屬性的多個實用程式。

Spring-LDAP 執行需要 J2SE 1.4。從原始碼構建分發二進位制檔案需要 J2SE 1.4 和 javacc。執行示例需要 J2EE 1.4 (Servlet 2.3, JSP 1.2)。

從何開始
從上面的連結下載發行版。發行版包含大量的 JavaDoc 文件以及完整的參考文件和一個演示如何使用 Spring LDAP 的示例應用程式。

主頁
Spring LDAP 的永久主頁位於 http://www.springframework.org/ldap

Mattias Arthursson & Ulrik Sandberg,Spring LDAP 專案團隊

Spring 2.5 RC1 已釋出 - 引入新的配置方法

工程 | Juergen Hoeller | 2007年10月24日 | ...

正如你們有些人已經注意到的那樣,Spring 2.5 RC1 終於在週一釋出了,正在等待您的試用!從很多方面來看,Spring 2.5 是一個完成 Spring 2.0 使命的版本:為 Java 1.4 和 Java 5 提供最靈活、最全面的配置模型。Spring 2.5 特別注重對 Java 5 的全面支援,引入各種進一步的註解選項。我想借此機會指出此版本背後的統一主題

Spring 2.5 允許方便的外部化配置,同時又儘可能保持簡潔。這建立在 Spring 2.0 對 XML Schema 名稱空間的支援之上,Spring 2.5 引入了新的“context”和“jms”配置名稱空間。後者是 Spring 配置名稱空間可以提供的增值的一個特別好的例子——如果您正在使用 Spring 2.0 風格的訊息驅動物件,絕對值得采用!此外,Spring 還允許無 XML 的程式設計引導……

Spring Framework 2.5 RC1 釋出

釋出 | Adrian Colyer | 2007年10月23日 | ...

親愛的 Spring 社群,

我很高興地宣佈,Spring Framework 2.5 的第一個候選釋出版已經發布!Spring 2.5 是 Spring 2.1 里程碑開始努力的成果,它增強了 Spring 2.0,增加了許多新功能,例如

  • 完整的 Java 6 和 Java EE 5 支援 (JDBC 4.0, JTA 1.1, JavaMail 1.4, JAX-WS 2.0 等)  
  • 功能齊全的註解驅動依賴注入(包括對 'qualifiers' 的支援) 
  • 支援 classpath 中的元件掃描(自動檢測帶註解的類) 
  • AspectJ 切點表示式中的 bean 名稱切點元素 
  • 內建支援 AspectJ 載入時織入(基於 LoadTimeWeaver 抽象) 
  • 進一步的 XML 配置名稱空間(“context”、“jms”)以提供最大便利 
  • 完全修訂的整合測試框架(支援 JUnit 4 和 TestNG)
  • Servlet MVC 和 Portlet MVC 的新註解式控制器風格
  • 擴充套件的 SimpleJdbcTemplate 功能(支援命名引數等) 
  • 官方認證的 WebSphere 支援(支援 WebSphere 6 UOWManager 功能) 
  • Spring Framework JAR 檔案開箱即用,以 OSGi 相容包的形式提供
  • Spring ApplicationContext 可以部署為 JCA RAR 檔案(用於無頭應用程式模組) 
  • JCA 1.5 訊息端點管理(用於 Spring 管理的 JMS 和 CCI 訊息監聽器)

Spring 2.5 RC1 Released

下載 | 文件 | 變更日誌 

特別值得一提的是此版本中引入的基於註解的 MVC 控制器風格、JAX-WS 支援和 TestNG 支援。此外,此版本提供了三種不同的分發包,包括一個最小標準 zip 和一個包含文件的中間 zip。

我們建議從所有先前的 2.0.x 版本升級到 Spring 2.5,以便受益於新功能以及 Spring 2.5 提供的顯著效能增強。Spring 2.5 設計為 Spring 2.0 的直接替代品,只是 jar 檔案內容略有重組(參見分發包中的 readme 檔案)。

請注意,Spring 2.5 仍然與 JDK 1.4.2+ 和 J2EE 1.3+ 相容。Java 1.4 使用者,例如在 WebLogic 8.1 或 WebSphere 5.1/6.0 上執行的使用者,也非常歡迎升級到 Spring 2.5!我們建議在 Java 1.4 上執行時將 backport-util-concurrent jar 放到 classpath 中,這將使 Spring(以及您的應用程式)受益於顯著的併發增強。

Juergen Hoeller
Interface21
http://www.interface21.com

Spring Tool Suite

工程 | Adrian Colyer | 2007年10月16日 | ...

您可能已經看到一些關於 Interface21 與 Tasktop 合作建立“Spring Tool Suite”的近期媒體報道。該套件將整合 Spring IDEAspectJ 開發工具 (AJDT)AspectJMylyn,為 Spring 驅動的企業應用開發建立一種以任務為中心的方法。我們希望在即將舉行的 The Spring Experience 會議上分享整合套件的預覽版,但在此期間,您會看到許多改進流入現有的 Spring IDE、AJDT、AspectJ 和 Mylyn 開源專案……

Gartner 精闢闡述創新與顛覆

工程 | Neelan Choksi | 2007年10月12日 | ...

在上個月的 Gartner 開源大會上,分析師宣佈開源已經滲透了全球軟體市場相當大的份額。近期的一篇 Matt Asay 部落格強調了這些細節,其中引用了eWeek 文章。eWeek 寫道:“開源產品在 2006 年的 927 億美元軟體市場中佔據 13% 的份額,但在 2011 年市場收入預計達到 1692 億美元時,應占市場份額的 27%。”

與此同時,Gartner 分析師 Massimo Pezzini 和 Yefim Natis 釋出了一份報告,強調了中介軟體和事務處理市場當前正在發生的重要顛覆。這份 2007 年 9 月 24 日的報告,題為 “平臺中介軟體趨勢:顛覆近在眼前”,強調了十幾個將“顛覆看似靜態的應用伺服器和事務處理市場”的趨勢,並警告……

Spring Web Flow 1.0.5 釋出

釋出 | Keith Donald | 2007年10月4日 | ...

親愛的 Spring 社群,

我們很高興宣佈 Spring Web Flow 1.0.5 已釋出。 這是一個錯誤修復和次要改進版本,解決了所有針對 1.0.4 報告的問題。 我們建議使用者從先前的 1.0.x 版本升級到 1.0.5。

 

Spring Web Flow 是下一代 Java Web 應用控制器框架。 該框架提供了一個強大的系統,用於在各種環境中一致地實現導航邏輯和管理應用狀態。

相關 Web Flow 新聞 

關於 Spring Web Flow 2.0 的工作仍在繼續,下一個 2.0 里程碑版本 (M2) 將於 10 月 30 日釋出。 

Interface21 在佛羅里達州墨爾本的 Web 應用開發產品團隊有一個全職職位空缺,該團隊負責持續開發 Spring MVC、Spring Web Flow 和新興的 Spring Web 技術。 歡迎經驗豐富的、能在佛羅里達州墨爾本工作的 Web 應用開發者申請。

Erwin Vervaet,該專案的創始人兼聯合負責人,出版了 《Spring Web Flow 實戰》,這是 Spring Web Flow 1.0 的權威指南。 

 

訂閱 Spring 新聞通訊

訂閱 Spring 新聞通訊,保持聯絡

訂閱

搶佔先機

VMware 提供培訓和認證,助您加速前進。

瞭解更多

獲取支援

Tanzu Spring 在一項簡單訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群所有即將舉行的活動。

檢視全部