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 社区所有即将举行的活动。

查看全部