Spring Java 配置 - M3 版本新特性

工程技术 | Chris Beams | 2008 年 3 月 27 日 | ...

今天发布了 Spring Java Configuration 项目(简称 JavaConfig)的第三个里程碑版本。此版本包含大量错误修复和新功能——我将在下面重点介绍一些最有趣的变化,但首先让我快速回顾一下 JavaConfig 的全部内容。

如果您有 Spring 的经验,以下 XML 配置片段可能会很熟悉。假设我们正在查看一个名为 application-config.xml 的文件


<beans>
	<bean id="orderService" class="com.acme.OrderService"/>
		<constructor-arg ref="orderRepository"/>
	</bean…

面向 JavaServerFaces 的 Spring - TSSJS 幻灯片和演示

工程技术 | Keith Donald | 2008 年 3 月 27 日 | ...

今天我在拉斯维加斯的 TSSJS 发表了一场题为 面向 Java Server Faces 的 Spring 的演讲。演讲探讨了 JSF 和 Spring 如何协同工作,并引导听众了解集成这两种技术的方法。

幻灯片可供您查看和随意使用。

在演讲中,我概述了集成 JSF 和 Spring 的两种方法。第一种方法我称之为“以 JSF 为中心”,这是大多数具有传统 JSF 背景的人今天采用的集成方法。第二种方法我称之为“以 Spring 为中心……”

在 Spring MVC 中使用混合注解和 XML 方法进行请求映射

工程技术 | Rossen Stoyanchev | 2008 年 3 月 24 日 | ...

在 Spring 2.5 中,可以使用注解配置 Web 应用程序的所有部分。在 Web 层应用注解特别有趣,传统上开发者依赖 SimpleFormController 和 MultiActionController 来处理表单页面。注解的引入创造了第三种选择,它不需要基类,同时仍然提供了以前方法的灵活性。

虽然使用带注解的 POJO 实现 Controller 很容易看出其优雅之处,但在 URL 到 Controller 的领域,这种好处并不那么明显……

SpringSource Tool Suite 发布

工程技术 | Christian Dupuis | 2008 年 3 月 20 日 | ...

今年的 EclipseCon 是我们公司第一次参加。我们举办了几场讲座,都受到了好评,并且我们宣布了 SpringSource Tool Suitebeta 项目。总的来说,我们都度过了一段非常愉快的时光,并从 Eclipse 社区获得了关于 Spring Portfolio 项目,特别是我们在 Web 领域工作的许多反馈。我将在接下来的几周内确保将所有反馈转达给项目负责人。由于 EclipseCon 今天即将结束,我终于有时间坐下来写下我们在会议上介绍的内容。

我们在周一的 BoF 期间发布了 SpringSource Tool Suite (STS) 的个人使用版本,并且花了很多时间与人们讨论它带来了哪些额外价值。在这篇博客中,我将更详细地概述 SpringSource Tool Suite 的功能。首先,我已经多次听说人们认为 SpringSource Tool Suite 的发布意味着我们将停止改进和塑造 Spring IDE。请允许我强调,这绝对不是事实;实际上,情况恰恰相反,从 Spring IDE 的 JIRA 和 Subversion 仓库就可以看出。事实上,自从我一月份加入 SpringSource 以来,我在并行开发工具套件的同时,能够投入更多时间在 Spring IDE 上。

SpringSource Tool Suite 的目标是为您在 Eclipse 平台上使用 Spring Portfolio 进行企业级开发提供最精密的开发工具——这听起来像营销术语,但这正是工具团队所承诺的使命宣言。STS 显然建立在成熟的 Spring IDE 之上,但它与 Eclipse Mylyn 紧密结合,并且已经扩展了这两个开源工具,将企业级扩展带入您的 IDE。为了提供最好的 Spring 工具,我们已经开始并将继续向 Spring 核心框架和其他 Spring 项目添加与工具相关的功能、钩子和扩展点。

因此,使用此工具套件,您最终将获得 Mylyn 的任务聚焦用户界面带来的所有益处,用于 Spring 开发。您在处理 Spring 应用蓝图时可以进行上下文管理和聚焦。此外,我们将任务聚焦 UI 方法提升到了一个新的水平,并引入了一项名为任务聚焦教程的新技术。任务聚焦教程扩展了 Eclipse Cheat Sheet 框架,并为教程的每个步骤添加了任务聚焦功能。通过任务聚焦教程,用户——无论是 Spring 新手,还是想要学习某个特定功能或 Spring 项目的人——都可以通过一次点击导入一个可运行的示例应用程序,并开始探索该示例。然后,教程的每个步骤将提供教程某个特定方面的解释,并只显示与理解和探索该解释相关的 Java 和 Spring 元素。

Task-Focused Tutorials

从上面的截图中,您可以看到它在 Eclipse 中的样子。教程将 PetClinic 示例应用程序导入到 Eclipse 工作区,并聚焦工作区,使其只显示 @Autowired 注解以及如何将其应用于应用程序组件。在右侧,您可以看到展开的步骤,解释了如何以及为何应该使用 @Autowired 注解。在教程的最后,用户可以通过一次点击在捆绑的 Tomcat 服务器上启动示例应用程序,该服务器会自动安装和配置。

我们认为这种介绍新特性和产品的方式是一种非常强大的方法,它让人们可以非常轻松地探索 Spring Portfolio。开发者在开始时所需的一切知识和工具都触手可及:就在 IDE 内部。当您下载个人使用版 Beta 时,您可以即时访问大约 20 个教程,这些教程全部由项目负责人或直接与客户合作的经验丰富的顾问创建。最值得一提的是,Adrian Colyer 花时间创建了 7 个教程,介绍了 OSGi 概念、Equinox 和 Spring Dynamic Modules。如果您现在想搭上 OSGi 的顺风车,这些教程非常棒。工具套件包含一个自动 OSGi bundle 更新/刷新机制,最终允许您在应用程序上工作,并基于 OSGi 运行时的强大功能实现即时重新部署语义(您是否尝试过使用 EJB?我试过)。

我想谈论的下一个功能称为 运行时错误分析:SpringSource Tool Suite 能够通过分析 Java 堆栈跟踪来提供有关如何解决运行时问题的信息。为了实现这一点,我们创建了一个在线知识库,它集成到工具套件中,并且可以在 Eclipse IDE 内部直接查询。该知识库对所有使用该工具的人开放,我们甚至鼓励人们使用内置的丰富编辑功能贡献自己的分析。请看下面的截图。

Runtime Error Analysis

使用此工具套件,您不仅可以获得运行时错误分析的支持,工具还会帮助您发现常见的陷阱违反 Spring 最佳实践的情况。特别是在处理 XML bean 定义文件时,此功能非常方便,因为它会直接在 XML 编辑器中告知开发者文件中可能需要修改的内容。例如,该工具会检测并推荐在某些情况下使用 bean 继承。它还会推荐使用不断改进的命名空间元素,而不是传统的 bean 定义样式。这是一个示例

Runtime Error Analysis

那么让我们看看我们有什么

  • Spring 开发工具
  • Mylyn 的任务聚焦用户界面,适用于 Java、资源和 Spring 应用蓝图
  • 任务聚焦教程
  • 运行时错误分析
  • 最佳实践和架构审查工具

还有更多我没有提及的功能。您看到这些功能列表中的主要主题了吗?最后列出的三个功能为开发强大的基于 Spring 的应用程序提供了宝贵的帮助。在内部,我们开始使用一个比喻来形容这组功能:盒子里的顾问。通过 SpringSource Tool Suite,我们希望让您能够获得 SpringSource 的知识,就像您身边坐着一位顾问一样!

我想鼓励大家前往 beta 注册页面 试用 Tool Suite。最后,我也想感谢所有已经提交反馈、问题和建议的人。在 EclipseCon 这个令人应接不暇的一周结束后,我会尽快回复大家。

Spring 依赖注入和 Java 5(包括幻灯片和代码)

工程技术 | Alef Arendsen | 2008 年 3 月 18 日 | ...

我写这篇文章的时候,正飞往开罗。我们正飞过意大利西部,我能清晰地看到意大利海岸线,湛蓝的海水和轻轻涌向岸边的波浪。那里现在一定很美。我将前往开罗参加由 Ahmed Hashim 组织的 埃及用户组 会议,我相信他一定做得非常出色。这次我将以 Spring 为主题进行演讲,主题是依赖注入、类型安全和 Java 5。昨天(也就是 3 月 14 日),我在荷兰 Loenen 的 Profict 冬令营为听众做了几乎相同的演讲……

Spring Web Flow 2.0 M4 - 征集反馈

工程技术 | Keith Donald | 2008 年 3 月 11 日 | ...

Web Flow 团队一直致力于 Web Flow 2 的开发。我们刚刚达到了第四个里程碑,最早下周将进入发布候选阶段。2.0 最终版本定于本月底发布。

从现在到 2.0 最终版本发布期间,我们期待您的反馈!如果您是目前正在使用 Web Flow 1.x 的应用程序开发者,或者正在评估 Web Flow 用于您的项目,请评估 2.0 M4 版本告诉我们您的想法。如果您是将 Web Flow 引擎集成到您的框架中的 Web 框架提供商,我们鼓励您评估 2.0 M4 中优化的钩子以及……

在 GWT 客户端代码中启用测试驱动开发

工程技术 | Iwein Fuld | 2008 年 2 月 19 日 | ...

在过去的几个月里,我一直在与各种客户合作使用 Google Web Toolkit [GWT] 的项目。我喜欢 GWT 主要因为它提供了 Java 到 JavaScript 的编译器。这是让普通 Java 开发者无需学习新语言即可创建 RIA 的关键。

我一直以来都是测试驱动开发(TDD)的粉丝,但令我失望的是,乍一看,TDD 和 GWT 似乎无法协同工作。

测试 GWT 代码有点问题。问题的核心在于 GWT 代码在运行之前会被编译成 JavaScript。在许多情况下,一个 GWT.create() 语句……

创建 OSGi bundle

工程技术 | Costin Leau | 2008 年 2 月 18 日 | ...

在接触 OSGi 时,首先必须学习的概念之一就是bundle的概念。在这篇文章中,我想仔细看看 bundle 到底是什么,以及一个普通的 jar 如何转换为 OSGi bundle。  那么,话不多说,

什么是 bundle?

OSGi 规范将 bundle 描述为“模块化单元”,它“由 Java 类和其他资源组成,这些资源共同可以为最终用户提供功能。”到目前为止还好,但 bundle 究竟是什么?再次引用规范

一个 bundle 是一个 JAR 文件,它

  • 包含 [...] 资源
  • 包含一个 manifest 文件,描述 JAR 文件的内容并提供关于 bundle 的信息
  • 可以在 JAR 文件的 OSGI-OPT 目录或其子目录中包含可选文档

简而言之,一个 bundle = jar + OSGi 信息(在 JAR manifest 文件 - META-INF/MANIFEST.MF 中指定),不需要额外的文件或预定义的文件夹布局。这意味着从一个 jar 创建一个 bundle 所需的全部工作就是向 JAR manifest 添加一些条目。

OSGi 元数据

OSGi 元数据由 manifest 条目表示,这些条目向 OSGi 框架指示 bundle 提供和/或需要什么。规范指出了大约 20 个 manifest 头,但我们只会看一些您最有可能使用的头。

Export-Package

顾名思义,此头指示导出哪些(在 bundle 中可用的)包,以便其他 bundle 可以导入它们。只有此头指定的包会被导出,其余的将是私有的,并且在包含此 bundle 的外部不可见。

Import-Package

Export-Package 类似,此头指示 bundle 导入的包。同样,只有此头指定的包会被导入。默认情况下,导入的包是强制性的——如果导入的包不可用,导入的 bundle 将无法启动。

Bundle-SymbolicName
唯一的必选头,此条目根据反向域名约定(Java 包也使用此约定)为 bundle 指定一个唯一的标识符。
Bundle-Name
为此 bundle 定义一个人类可读的名称,不含空格。建议设置此头,因为它比 Bundle-SymbolicName 能提供更短、更有意义的关于 bundle 内容的信息。
Bundle-Activator
BundleActivator 是一个 OSGi 特定的接口,它允许 Java 代码在 bundle 由 OSGi 框架启动或停止时接收通知。此头的值应包含激活器类的完全限定名,该类应是公共的且包含一个不带任何参数的公共构造函数。
Bundle-Classpath
当 jar 包含各种文件夹下的嵌入式库或类包时,此头非常方便,它通过扩展默认的 bundle 类路径(默认类路径期望类直接位于 jar 根目录下)来实现。
Bundle-ManifestVersion
这个鲜为人知的头指示用于读取此 bundle 的 OSGi 规范版本。1 表示 OSGi Release 3,而 2 表示 OSGi Release 4 及更高版本。由于 1 是默认版本,强烈建议指定此头,因为 OSGi Release 4 的 bundle 在 OSGi Release 3 下无法按预期工作。

下面是一个示例,取自 Spring 2.5.x 核心 bundle 的 manifest 文件,使用了上面提到的一些头

 
Bundle-Name: spring-core 
Bundle-SymbolicName: org.springframework.bundle.spring.core 
Bundle-ManifestVersion: 2 
Export-Package:org.springframework.core.task;uses:="org.springframework.core,org.springframework.util";version=2.5.1 org.springframework.core.type;uses:=org.springframework.core.annotation;version=2.5.1[...] 
Import-Package:org.apache.commons.logging,edu.emory.mathcs.backport.java.util.concurrent;resolution:=optional[...] 

花在 OSGi 元数据上的大部分时间可能都用于 Export/Import 包条目,因为它们描述了 bundle 之间的关系(即您的模块之间的关系)。对于包来说,没有任何隐式规则——只有提及的包才会被导入/导出,其余的则不会。这也适用于子包:导出 org.mypackage导出这个包,而不是其他任何东西(例如 org.mypackage.util)。导入也是一样——即使一个包在 OSGi 空间中可用,除非某个 bundle 明确导入它,否则它将不可见。

总结一下,如果 bundle A 导出包 org.mypackage 并且 bundle B 想要使用它,那么 bundle A 的 META-INF/MANIFEST.MF 应在其 Export-Package 头中指定该包,而 bundle B 应将其包含在其 Import-Package 条目中。

包的考虑

导出相当直接,但导入稍微复杂一些。应用程序通常会通过搜索环境中的特定库并仅使用可用的库来良好地降级,或者库包含用户未使用的代码。这些例子包括日志记录(使用 JDK 1.4 或 Log4j)、正则表达式(Jakarta ORO 或 JDK 1.4+)或并发工具(JDK 5 中的 java.util 或用于 JDK 1.4 的 backport-util-concurrent 库)。

用 OSGi 的术语来说,根据包的可用性来依赖它,这等同于一个可选的 Package-Import。您已经在前面的示例中看到过这样的包

```code Import-Package: [...]edu.emory.mathcs.backport.java.util.concurrent;resolution:=optional ```

由于在 OSGi 中,可以存在同一个类的多个版本,因此最佳实践是在导出和导入包时都指定类包的版本。这是通过在每个包声明后添加 version 属性来完成的。OSGi 支持的版本格式是 <major>.<minor>.<micro>.<qualifier>,其中 majorminormicro 是数字,qualifier 是字母数字。

版本含义完全由 bundle 提供者决定,但建议使用流行的编号方案,例如 Apache APR 项目的方案,其中

  • <major> - 表示重大更新,不保证兼容性
  • <minor> - 表示保留与旧次版本兼容性的更新
  • <micro> - 表示从用户角度来看无关紧要的更新,完全向前和向后兼容
  • <qualifier> - 是用户定义的字符串 - 不广泛使用,可以为版本号提供额外的标签,例如构建号或目标平台,没有标准化的含义

默认版本(如果属性缺失)是“0.0.0”。

导出的包必须指定特定版本,而导入者可以使用数学区间表示法指定范围 - 例如

[1.0.4, 2.0) 将匹配版本 1.0.42 及以上直至 2.0(不包含)。请注意,如果只指定一个版本而不是区间,将匹配所有大于或等于指定版本的包,即

Import-Package: com.mypackage;version="1.2.3"

等价于

Import-Package: com.mypackage;version="[1.2.3, ∞)"

最后一点提示,指定版本时,无论是范围还是单个版本,请务必始终使用引号。

使用 OSGi 元数据

既然我们已经了解了 bundle 的一些信息,接下来看看可以使用哪些工具来将现有 jar OSGi 化

手动方式

不建议采用这种手动方式,因为很容易出现打字错误和多余空格,导致 manifest 文件失效。即使使用智能编辑器,manifest 格式本身也可能引发一些问题,因为它规定每行最多 72 个空格,如果超出则可能导致一些难以理解的问题。手动创建或更新 jar 也不是一个好主意,因为 jar 格式要求 META-INF/MANIFEST.MF 条目必须是归档中的第一个——如果不是,即使它存在于 jar 中,manifest 文件也不会被读取。手动方式只在没有其他替代方案的情况下才真正推荐使用。

然而,如果确实想要/需要直接处理 manifest 文件,则应使用能够处理 UNIX/DOS 空格的编辑器,并结合适当的 jar 创建工具(例如 JDK 自带的 jar 工具),以满足所有 MANIFEST 要求。

Bnd

Bnd 是 BuNDle tool 的缩写,是一个由 Peter Kriens(OSGi 技术官员)创建的实用工具,它“帮助 [...] 创建和诊断 OSGi R4 bundle”。Bnd 解析 Java 类以了解可用和导入的包,从而创建相应的 OSGi 条目。Bnd 提供了一系列指令和选项,可以自定义生成的 artifact。bnd.jar 本身的优点在于它可以从命令行运行,通过 Ant 的专用任务运行,或作为插件集成到 Eclipse 中。

Bnd 可以从类路径中或 Eclipse 项目内的类创建 jar,也可以通过添加所需的 OSGi artifacts 来将现有 jar OSGi 化。此外,它可以打印和验证给定 jar 的 OSGi 信息,使其成为一个功能强大但易于使用的工具。

初次使用的用户可以使用 Bnd 查看普通 jar 会被添加哪些 OSGi manifest 条目。让我们选择一个普通 jar,例如 c3p0(这是一个出色的连接池库),然后执行打印命令

```code java -jar bnd.jar print c3p0-0.9.1.2.jar ```

输出内容相当多,包含多个部分

  1. 通用 manifest 信息
    [MANIFEST c3p0-0.9.1.2.jar]
    Ant…

Spring Batch 最新变化和即将发布的 m4 版本

工程技术 | Dave Syer | 2008 年 2 月 4 日 | ...

我们一直在努力开发 Spring Batch,为 Spring Portfolio 2.5 版本发布列车做准备,我认为现在是时候向大家更新一下情况了。在本文中,我将稍微扩展一下领域建模,以及我们决定提升一些核心领域对象的地位并增加其职责的决定。我还将稍微介绍一下接下来几个版本直到 1.0 版本将要发布的内容,以便大家有机会发表评论(如果愿意的话)。

在此致歉:内部发生了一些相当大的变化……

有些决定很容易——比如 SpringSource 收购 Covalent

工程技术 | Rod Johnson | 2008 年 1 月 29 日 | ...

我的上一篇博客展示了 Spring 如何超越 EJB。BZ Media 等公司的研究显示,Apache Tomcat 是领先的开源应用服务器,市场渗透率达 64%。Spring 和 Tomcat 的主导地位众所周知。人们可能不太了解的是,成千上万的组织正在 Tomcat 上运行 Spring 作为其中间件基础设施。这些组织希望有一个公司可以为他们提供成功所需的产品和服务。

今天我们宣布收购了 Covalent Technologies。Covalent 不仅带来了 Apache 领域的领导地位,而且我们合并后的公司在 Apache Tomcat 和 HTTP 方面也拥有重要的领导地位。两周前,Sun 为 LAMP 中的“M”支付了 10 亿美元。现在 Covalent 杰出的 Apache 专业知识和服务已成为 SpringSource 的一部分,我们在“A”领域也成为了强有力的领导者。我们一直以来都致力于技术领导地位,因此对于我们与 Covalent 携手合作能取得的成就感到非常兴奋。在过去几年中,Covalent 因其对 Apache 项目(包括 Tomcat 和 Apache HTTP)的支持而在市场上赢得了极高的声誉。其数百个支持客户包括财富 500 强中的一半以上,以及辉瑞、强生、英国电信 (BT)、NASA、英特尔、苏格兰皇家银行和贝尔斯登等家喻户晓的公司。我们的公告……

订阅 Spring 快讯

订阅 Spring 快讯,保持连接

订阅

领先一步

VMware 提供培训和认证,助您飞速提升。

了解更多

获取支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一个简单的订阅即可获得。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看全部