它是 Tomcat,還是房間裡的大象?

工程 | Rod Johnson | 2007 年 12 月 24 日 | ...

有時候,重要的變化會悄悄地發生。這些變化並非由行銷活動推動,而是由許多個別的決策所驅動;沒有大張旗鼓;當它們被觀察到時,已經具有驚人的動能。我在最近的 Spring Experience 會議的開幕主題演講中提到了這樣一個發展:Tomcat 的穩步崛起。

最近,我們開始在 SpringFramework.org 上進行民意調查,其中一些結果很有趣。您使用哪些應用程式伺服器? 這個問題產生了以下結果:BEA WebLogic(各種版本)和 JBoss AS 在 Java EE 應用程式中並列第一名…

Spring Integration 範例

工程 | Mark Fisher | 2007 年 12 月 21 日 | ...

在我的 最近的文章中,我提到 Spring Integration 的 Subversion 儲存庫很快就會公開存取,我很高興現在提供該連結。您可以使用以下命令簽出該專案

svn co https://anonsvn.springframework.org/svn/spring-integration/base/trunk spring-integration

如果簽出成功,您應該會看到以下目錄結構

spring-integration/
  +--build-spring-integration/
  +--spring-build/
  +--spring-integration-core/
  +--spring-integration-samples/

我想藉此機會介紹幾個…

Spring Integration:Spring 產品組合的新成員

工程 | Mark Fisher | 2007 年 12 月 14 日 | ...

昨天上午,我在 The Spring Experience 上發表了一個由兩部分組成的會議,標題為「使用 Spring 的企業整合模式」。第一個簡報包括核心 Spring 對企業整合的支援概述 - 包括 JMS、遠端處理、JMX、排程和電子郵件。該簡報還包括對 Gregor Hohpe 和 Bobby Woolf 在同名書籍中介紹的幾個 企業整合模式 的高階討論。在第二個簡報中,我正式發布了「Spring Integration」 - Spring 產品組合的新成員。Spring Integration 建立在…

Spring Security 2 中的新功能?

工程 | Ben Alex | 2007 年 12 月 06 日 | ...

我今天在瀏覽部落格圈時,遇到了 最短的部落格 之一。引用幾乎整個條目,「每次您使用 Acegi,就會有一隻仙女死去。可悲的是,周圍實在沒有更好的東西了…」。

在我們的 社群論壇開發人員 列表JIRA使用者 會議 BOF培訓支援顧問諮詢團隊部落格 之間,我們收到了大量的社群意見回饋。毫無疑問,許多人一直在尋求改進 Spring Security(以前稱為 Acegi)的配置格式,我們投入了大量時間使其成為可能。

由於我將在下週的 Spring Experience 會議上進行 演講,Spring Security 2.0.0 M1 具有極其簡化的配置。現在,您可以將 Spring Security 新增到您的…

Spring 動態語言支援和 Groovy DSL

工程 | Dave Syer | 2007 年 11 月 29 日 | ...

自 Spring 2.0 中引入 Spring 動態語言支援以來,它一直是 Groovy 的一個有吸引力的整合點,Groovy 為定義領域特定語言 (DSL) 提供了一個豐富的環境。但是 Spring 參考手冊中 Groovy 整合的範例範圍有限,並且沒有顯示 Spring 中針對 DSL 整合的功能。在本文中,我將展示如何使用這些功能,並以一個範例為例,我們使用 Grails 發行版中的 Groovy DSL 將 Bean 定義新增到現有的 ApplicationContext。

Groovy Beans

Spring 動態語言整合的基本功能在 XML 的「lang」命名空間中公開。您可以做的最直接的事情是將 Spring 組件定義為 Groovy Bean,在一個單獨的檔案中或在 XML 中內聯。Spring 參考指南中涵蓋了此功能 (http://static.springframework.org/spring/docs/2.5.x/reference/index.html

Spring Framework Maven Artifacts

工程 | Ben Hale | 2007 年 11 月 26 日 | ...

根據 普遍需求,Spring Framework Maven Artifacts 現在正在上傳到 Spring Snapshot Maven 儲存庫。您可以在我的 先前文章中找到有關所有 Spring Portfolio Maven 儲存庫的詳細資訊,但我將在此處重新列印 Spring 快照儲存庫的詳細資訊。

Spring Snapshot Maven 儲存庫位於 http://s3.amazonaws.com/maven.springframework.org/snapshot。使用此儲存庫需要您將一個條目新增到 POM 中的 <repositories/> 元素。它應該看起來像這樣


<repository>
    <id>spring-snapshot</id>
    <name>Spring Portfolio Snapshot…

Interface21 成為 SpringSource

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

我們正在更改我們的名稱。本週,Interface21 將成為 SpringSource。

在我們建立公司的過程中,Interface21 因其卓越的產品、思想領導力、傑出的人才、專業精神以及高品質的支援和服務而贏得了聲譽。當我們繼續提供所有這些東西時,我們相信更改我們的名稱將有助於我們的公司將它們帶給更廣泛的受眾。

當我在 2004 年創立 Interface21 時,我必須選擇一個名稱。我相信 Spring 是企業 Java 的未來,「Interface21」反映了這些感受 - 21 世紀的框架。現在我們…

Spring Web Flow 2.0 願景

工程 | Keith Donald | 2007 年 11 月 15 日 | ...

Spring Web Flow 2.0 M2 剛剛 發布。我對此版本特別感到興奮,因為它為我們實現對社群未來的宏偉願景奠定了基礎。在本文中,我將解釋該願景是什麼,以及該基礎將具體實現什麼。我還將詳細介紹 Web Flow 2.0 的架構,並將其與 1.0 版本進行比較。

Spring Web Flow 2.0 願景

2.0 的目標是發展 Spring Web Flow 作為一個受控的導航引擎,以提供對 JavaServerFaces、流程管理持久性和非同步事件處理 (Ajax) 的顯著改進的支援。新的 Spring Faces 專案將建立在 Web Flow 2.0 之上,以在 Spring 環境中提供對 JSF 檢視的一流支援。此外,Web Flow 將繼續提供對基於 Spring MVC 的檢視的一流支援,允許本地 JSF 和 MVC 檢視以全功率使用,即使在同一個應用程式中也是如此。

* 更新:上述願景在 2008 年 1 月 11 日更新,此前考慮了 Spring 社群自 2007 年 Spring Experience 以來的大量回饋。根據該回饋,Spring Web Flow 2.…

Spring 2.5 中的註解 Web MVC 控制器

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

Spring 2.5 引入了一種編寫註解 Web MVC 控制器的方法,我們尚未對此進行太多部落格文章… 我將藉此機會向您概述當今 Spring MVC 的真正含義。

Spring MVC 本質上是一個請求分派器框架,帶有 Servlet API 變體和 Portlet API 變體。它在其託管環境中非常緊密地運行 - 無論是 Servlets 還是 Portlets。可以將 Spring MVC 視為在 Servlet/Portlet 容器之上提供基礎設施和便利性:例如,靈活的請求映射、控制器之間的隔離…

對:EJB 3 和 Spring 比較分析的回應

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

昨晚我參加了新英格蘭 Java 使用者群組 (NEJUG) 會議,Reza Rahman 在會上展示了 EJB 3 和 Spring 的「比較分析」。Reza 是 EJB 3 in Action 的作者之一。我很高興見到 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)和「刻板印象」註解的概念。例如,@Repository 註解為直接使用 JPA 或 Hibernate API(沒有 Spring 的模板)的資料存取程式碼啟用非侵入式例外情況轉換。Spring 甚至早在 1.2 版就提供了註解支援,例如 @ManagedResource 用於將任何 Spring 管理的物件透明地匯出為 JMX MBean。

現在這個問題對我來說是首要問題,主要原因是評論說「這需要他們一段時間」。身為 Spring 2.5 註解驅動配置支援的主要開發者之一,我必須說 Spring 的 metadata 模型非常彈性,因此我們能夠比預期更快地提供一個全面的基於註解的模型。事實上,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 還擴展了「刻板印象」註解,包括 @Service 和 @Controller。每個刻板印象註解都透過將其作為 meta-annotation 應用來擴展通用的 @Component 註解。透過應用相同的技術,@Component 註解為使用者定義的刻板印象提供了一個擴展點。Spring 甚至可以自動偵測這些帶註解的元件,作為 XML 配置的替代方案。例如,這個摘錄取自 PetClinic 範例應用程式的 2.5 版本


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

無需額外的 XML 用於 web 控制器,因為它們使用註解驅動的依賴注入和用於請求映射的註解。我指出這一點,是因為簡報特別強調了 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 範例顯示了透過 entityManager 進行資料存取的 JPA,以及使用 @PersistenceContext 註解提供的 entityManager 實例。另一方面,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 事務管理和異常轉換方面以一致的方式實現。然後,這就開啟了使用 Hibernate 功能的機會,這些功能超出了 JPA 的限制,例如 Hibernate 的 "criteria" 查詢 API。同樣地,如果您想為資料存取添加一些直接 JDBC,其中 ORM 過於繁瑣,Spring 也支援這一點 - 即使在與 Hibernate 或 JPA 資料存取相同的事務中調用也是如此。

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

一個具體的例子是事務管理員的定義。聲明您必須了解容器供應商級別的事物才能配置 Spring 集成。這是錯誤的。例如,以下 bean 定義不包含任何容器特定的資訊,但 Spring 將在所有 Java EE 應用程式伺服器中自動偵測事務管理員


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

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

除此之外,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 這一特定優勢的細節。例如,這對於在容器外進行測試或在輕量級 IDE 環境(例如 Eclipse 或 IDEA)中進行開發來說是一個巨大的好處。

此外,如果您確實需要 JTA 進行分布式事務,但想在像 Tomcat 或 Jetty 這樣的輕量級容器中運行,Spring 可以輕鬆支援像 Atomikos 和 JOTM 這樣的獨立 JTA 提供者。當然,Spring 的事務管理員設置需要配置單個 bean 定義,但這確實是一次性成本 - 並且非常值得。

5. Spring 沒有有狀態的應用程式範例。

無狀態服務層的優點已相當成熟,是一種最佳實踐,Spring 也接受這一點。但是,Spring 確實提供了單例以外的其他範圍。Spring 的「原型」範圍為每次注入或查找啟用一個不同的實例,而 Spring 2.0 引入了 web 範圍:「request」和「session」。範圍機制本身甚至是可擴展的;可以定義自定義範圍並將其映射到對話的概念。Spring 還支援使用 CommonsPoolTargetSource 的簡單物件池,但物件池很少是狀態管理的最佳解決方案。

更重要的是,Spring 透過 Spring Web Flow 為 web 應用程式提供非常強大、高度可配置的狀態管理。在那裡,對話狀態是透明地管理的,這與本次簡報聲稱開發人員必須直接與 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 新聞通訊

與 Spring 新聞通訊保持聯繫

訂閱

領先一步

VMware 提供培訓和認證,以加速您的進度。

了解更多

獲取支持

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二進位文件。

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

查看所有