是 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日 | ...

昨天上午,我在Spring Experience上做了一个两部分的演讲,题为“使用 Spring 的企业集成模式”。第一次演讲包括对企业集成核心 Spring 支持的概述——包括 JMS、远程调用、JMX、调度和电子邮件。该演讲还对 Gregor Hohpe 和 Bobby Woolf 在同名书籍中介绍的几个企业集成模式进行了高级讨论。在第二次演讲中,我正式推出了“Spring Integration”——Spring 产品组合中的一个新成员。Spring Integration 基于……

Spring Security 2 中的新功能?

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

我今天浏览博客圈,偶然发现了我读过的最短的博客之一。引用几乎全部内容,“每次使用 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 工件

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

根据大众需求,Spring Framework Maven 工件现在已上传到 Spring Snapshot Maven 存储库。您可以在我的上一篇文章中找到所有 Spring 产品组合 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 的视图提供一流的支持,允许在 Spring 环境中使用原生 JSF 和 MVC 视图,即使在同一个应用程序中也可以根据需要使用。

* 更新:在考虑了自 2007 年 Spring Experience 以来来自 Spring 社区的大量反馈后,上述愿景于 2008 年 1 月 11 日进行了更新。根据这些反馈,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 变体。它在其托管环境(Servlet 或 Portlet)中非常紧密地运行。将 Spring MVC 视为在 Servlet/Portlet 容器之上提供基础设施和便利性的工具:例如灵活的请求映射、控制器之间的分离……

对 EJB 3 和 Spring 比较分析的回应

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

昨晚我参加了新英格兰 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 版本提供了与 @PersistenceContext 的完全 JPA 集成,用于注入 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元数据模型非常灵活,因此我们能够比预期更快地提供全面的基于注解的模型。事实上,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注解为用户定义的stereotype提供了扩展点。Spring甚至可以自动检测这些带注解的组件,作为XML配置的替代方案。例如,这段摘录取自2.5版本的PetClinic示例应用程序。


   <context:component-scan base-package="org.springframework.samples.petclinic.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框架主页,以了解即将发布的一些文章和博客,内容涵盖2.5版本。

2. Spring允许您支持多个部署环境,但需要更多配置。

这实际上被认为是Spring的一个优势,但强调了配置开销。事实是,任何认真对待测试和敏捷开发的项目都需要支持“多个部署环境”。换句话说,这个特定主题经常被歪曲,好像它只适用于多个_生产_环境。实际上,在每个开发和测试周期中都必须部署到应用服务器是敏捷性的一大障碍。通常,Spring用户会将他们的配置模块化,以便“基础设施”配置(例如DataSource、TransactionManager、JMS ConnectionFactory)是独立的,并且外部化动态属性。由于Spring支持根据外部化的属性替换'${占位符}',因此包含不同的属性文件通常成为一个透明的问题。

3. 使用JPA的EJB,使用Hibernate的Spring

我必须承认,这让我最困扰。在比较幻灯片中,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事务管理和异常转换方面以一致的方式这样做。然后,这将有机会使用超出JPA限制的Hibernate功能,例如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_、_WebSphereUowTransactionManager_和_OC4JJtaTransactionManager_。在这些实现之间切换只是更改此单个定义的问题。

除此之外,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很容易支持独立的JTA提供程序,如Atomikos和JOTM。当然,Spring的事务管理器设置需要配置_单个_bean定义,但这确实是一次性成本——并且非常值得。

5. Spring没有状态应用程序范例。

无状态服务层的好处作为最佳实践已被广泛认可,Spring也接受了这一点。但是,Spring提供的范围不仅仅是单例。Spring的“prototype”范围为每次注入或查找启用一个不同的实例,Spring 2.0引入了web范围:“request”和“session”。范围机制本身也是可扩展的;可以将自定义范围定义并映射到对话的概念。Spring还支持使用CommonsPoolTargetSource进行简单的对象池化,但对象池化很少是状态管理的最佳解决方案。

更重要的是,Spring通过Spring Web Flow为web应用程序提供了非常强大、高度可配置的状态管理。与本演示文稿声称的开发人员必须直接与HTTP Session交互以管理Spring应用程序中的状态相反,这里的会话状态是透明管理的。此外,存储库配置是可插拔的,因此可以使用各种策略来进行状态的物理存储(会话、客户端、后端缓存等)。最后,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社区中所有即将举行的活动。

查看全部