SpringSource Tool Suite 2.6.0.M1 发布
亲爱的 Spring 社区,
很高兴宣布我们刚刚发布了下一个 SpringSource Tool Suite (STS) 版本的第一个里程碑构建版本。
此里程碑构建版本的一些亮点
- @Autowired 和 @Qualifer 的内容辅助和快速修复
- @RequestMapping 中用于路径变量的内容辅助
- 更新的 Spring 项目向导
- 来自 ITD 的 RequestMappings 现在在 Spring Explorer 和 RequestMapping-View 中可用
- 改进的 Groovy 内容辅助性能
- 改进的 Groovy 语法高亮
一如既往,可从 STS 下载页面获取下载,请查看“其他下载”。
Green Beans: 企业消息传递和 Spring 入门
在这篇文章中,我们将介绍消息传递的核心概念,以及 Spring 框架及其姊妹项目为各种类型的消息传递提供的丰富支持。
什么是消息传递?为了更好地解释这一点,我将转述 Gregor Hohpe 和 Bobby Woolf 合著的开创性著作 Enterprise Integration Patterns (Addison Wesley, 2004) 中提供的示例。当你打电话时,你试图将信息传递给另一方。这只有在对方在你打电话时可用才有效。由于无法始终接听电话,我们使用语音信箱来排队消息。来电者在语音信箱中留言,然后被呼叫者可以稍后随时检索消息(甚至许多消息),这是异步的。
在该示例中,语音信箱位于双方中间。它存储消息,并在被呼叫者(即接收者)检索时传递消息。在企业消息传递世界中,情况非常相似:一方将消息发送到消息代理(也称为面向消息的中间件 – MOM),另一方(在其方便时)接收或显式查询消息代理中的任何消息。
这里的类比不再适用。与语音信箱不同,消息代理有很多选项。消息代理非常适合提供额外的服务,例如路由,并提供消息传递保证。消息代理可以针对不同的用例进行优化,例如,你可以用速度换取持久性。消息代理可以将消息持久化到外部存储以确保持久性,尽管这通常是为了速度而可以切换的配置。
在语音信箱示例中,消息由一方发送并传递给另一方——这种通信是点对点的。消息代理支持这种方式,也支持另一种称为发布-订阅的通信类型,其中消息被传递给多个客户端。
消息代理的一个常见用途是解决两个不同系统之间的集成问题。发送到消息代理的数据通常是发送者和接收者都通用的格式。两个系统要使用消息代理唯一需要达成一致的是数据契约。消息通常有一个消息体,其中存储消息本身的内容,以及消息头,消息头是关于消息体的元数据,可以帮助消息消费者处理消息。消息头可以是任何内容,但通常与消息本身或消息处理器相关。
Java 消息服务
Java 消息服务 (JMS) API 规定了与消息代理交互的客户端接口。每个消息代理提供自己的 API 实现,就像 JDBC 驱动程序为 JDBC API 所做的那样。这意味着 JMS 客户端通常应该使用与服务器相同版本的客户端。有许多优秀的 JMS 代理实现可供选择。其中一个原因是消息传递一直是应用程序开发的重要组成部分,如今更是如此。自 1.1 版本以来,JMS 一直是 J2EE(现为 Java EE)规范的一部分。在过去十年中的大部分时间里,JMS 规范一直处于 1.1 版本。
在 JMS 中,客户端使用 javax.jms.ConnectionFactory
创建 javax.jms.Connection
。然后可以使用 Connection
创建 javax.jms.Session
。Session
表示客户端与代理的交互,并允许发送和接收消息以及其他不太明显的操作。
接口上最有用的方法是关于创建消息生产者和消息消费者,它们负责向或从 javax.jms.Destination
发送和接收消息。Destination
映射了 JMS 中消息代理上“地址”的概念。它也映射了代理存储消息的位置的概念。在 JMS 中,消息发送到、存储在和消费自同一个地方,所有这些都由 javax.jms.Destination
实例表示。

Destination
是一个接口,它有两个更具体的子接口:javax.jms.Queue
和 javax.jms.Topic.
。Queue
代表一个标准队列,它是前面描述的点对点结构。Topic
提供发布-订阅消息传递,并且可以将单个消息传递给多个接收者。
要向 Destination
发送消息,必须创建 javax.jms.MessageProducer
。然后可以使用 MessageProducer
发送 javax.jms.Message
。
JMS 支持两种不同的接收消息机制。第一种方式是请求消息,使用 javax.jmx.MessageConsumer#receive()
方法,该方法以同步方式从 Destination
返回单个消息;默认情况下,该方法会阻塞直到接收到消息。客户端也可以不使用 MessageConsumer
,而是通过调用 javax.jms.Session#setMessageListener(MessageListener)
安装 javax.jms.MessageListener
。MessageListener
是一个接口,只有一个方法 public void onMessage(javax.jms.Message)
,当 javax.jms.Message
在 Destination
上可供消费时,该方法将被调用。MessageListener
提供异步消息处理:消息到达时,即被处理。
JMS API 中还有很多东西可以学习,但这些类和概念将最有助于我们讨论 Spring 对 JMS 消息传递的支持。第一层支持是 org.springframework.jms.core.JmsTemplate
,它提供了简化方法,将我们刚才讨论的内容简化为一行代码。JmsTemplate
工作时需要一个 javax.jms.ConnectionFactory
实例。JmsTemplate
可以为你做很多工作。例如,要发送消息,JmsTemplate
会建立一个 javax.jms.Session
,设置一个 javax.jms.MessageConsumer
或 javax.jms.MessageProducer
,设置所有事务机制,并为你提供当前 javax.jms.Session
的引用,以便你可以创建所需的消息并发送它。有了所有的错误处理和构建逻辑,这很容易节省数十行代码。一旦消息发送出去,它会销毁或关闭大部分这些对象。这在应用程序服务器(如 Java EE 服务器)中是标准做法,因为 ConnectionFactory
实例是由服务器创建、管理和池化的。它们在使用后会缓存实例。在这些环境中关闭资源只是将它们返回到池中。因此,在标准情况下,假设 ConnectionFactory
缓存或池化实例,JmsTemplate
会做正确的事情。
在像应用程序服务器这样的托管环境中,你通常需要从 JNDI 获取 javax.jms.ConnectionFactory
。你可以使用 Spring 来查找该引用并配置 JmsTemplate
。在我们的示例中,我们希望操作更灵活,因此我们将使用独立的 ActiveMQ 消息代理。ActiveMQ 是一个流行的开源消息代理。要使用它,请下载它,然后在 bin 文件夹中运行适用于你操作系统的启动脚本。在你的应用程序中,你需要客户端库来连接相应版本的 ActiveMQ。在撰写本文时,ActiveMQ 的最新版本是 5.4.2。如果你使用 Maven,请将以下依赖项添加到你的 Maven pom 文件中
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-core</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-optional</artifactId>
<version>${activemq.version}</version>
</dependency>
请确保为 ${activemq.version}
创建一个 Maven 属性,或者手动将字符串替换为相应的版本。还有一个 activemq-all
依赖项,但它会下载很多可能不需要的 jar 包。对于我们的应用程序,上述两个依赖项就足够了。
Spring 与 JMS 的结合使用
让我们检查一个基本的 JMS 应用程序的配置。首先,让我们检查基本的 Spring XML 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/200…
SpringOne 2GX 2010 技术讲座:Spring Integration 2.0 的新特性?
由 InfoQ 发布了另一场来自 SpringOne 2GX 2010 的讲座。这次是由 Mark Fisher 和 Oleg Zhurakousky 主讲 Spring Integration 2.0 的新特性。
Mark 和 Oleg 使用以代码为中心的演示来描述 Spring 3.0 功能如何集成到 Spring Integration 中,实现了哪些企业集成模式,以及哪些通道适配器和网关已更新。他们演示了新的 STS 工具对 Spring Integration 的支持,并讨论了该项目的一些未来特性和方向。
这个演示是了解 Spring Integration 2.0 的绝佳方式。2.0 的 GA 版本在此讲座后不到一个月发布,因此涵盖的所有主题都与当前版本同步。再次非常感谢 InfoQ 对 SpringOne 2GX 2010 的报道。
本周 Spring:2011 年 1 月 18 日
Spring 社区又度过了精彩的一周。除了 Tomcat 7 稳定版本发布的激动人心的公告外,社区还发布了许多精彩的帖子。
- 继续“Green Beans”基础系列,我们刚刚发布了一篇关于 一起使用 Spring 和 Maven 的文章。
- Tomcat Expert 社区宣布了 Tomcat 7 的第一个稳定构建版本。我们知道 Tomcat 是 Spring 开发者运行应用程序最喜欢的地方,所以务必查看最新功能。
- Nicholas Sankel 写了一篇关于将 Spring Roo 与 Vaadin UI 框架结合使用的博客。
- Tomcat Expert 社区提供了 2010 年的十大文章列表。
- Tomasz Nurkiewicz 写了一篇精彩的博客,探讨了如何完全不使用 XML 来使用 Spring 框架。
- Sivaprasadreddy Katamreddy 撰写了 Spring AOP 入门,从有问题代码一直到使用 Spring AOP 改进的代码。
- 一位名叫 Warlock(据我所知)的先生在他的博客 上介绍了 Spring MVC 基于注解的会话处理支持。
- Sal Peace 撰写了一篇精彩的入门文章,介绍了如何将 Spring MVC 3.0 的 Portlet 支持与 WebSphere 7 结合使用。
- Viral Patel 写了一篇关于在 Spring 3 MVC 和 Hibernate 中保存和检索 BLOB 对象数据的教程。
- Jorram Barrez(来自 Activiti 项目)发布了一篇关于如何使用 Spring 将 Activiti BPMN 2.0 业务流程连接到 EJB 业务服务的文章。
Green Beans: Maven 和 Spring 入门
Apache Maven 是一种流行的开源工具,它提供了一种约定优于配置的项目构建管理方法。事实上,Eclipse 社区调查显示 Maven 的采用率从 2009 年的 8% 增加到 2010 年的 28%,突显了其在各种项目设置中的实用性。尽管你可以在不使用 Maven 的情况下使用 Spring,但仍有很多理由推荐 Spring 开发者使用它。在这篇文章中,我将向你展示如何开始使用 Maven,以及如何将其与 Spring 库、仓库以及像 SpringSource Tool Suite 和 Spring Roo 这样的工具成功结合使用。
Maven 处理项目构建。如果你的项目遵循 Maven 的约定,Maven 可以相对容易地提供强大的功能和复杂性。它是声明性的;你描述的是你想要完成什么,而不是你想要如何完成。如果你来自像 Make 或 Ant 这样的老牌构建工具,这种方法会显得不同。
你在 Maven 项目配置中声明项目的依赖项。然后 Maven 会代表你解析并下载这些依赖项。这类似于许多不同操作系统中的软件包系统。假设你正在使用 OS X 的 fink
或 ports
命令行工具。要更新操作系统的某个功能,用户在管理客户端中选择一个软件包(例如,最新的安全补丁,或新版本的 glib
库)进行安装,然后指示客户端从已知服务器(称为软件包仓库)下载并安装。软件包下载后,软件包管理器会查阅该软件包的清单,其中列出了该软件包依赖的所有库(在其他软件包中找到)——即它的传递依赖。这些也会被下载。
如果你尚未安装 Maven,有几种方法可以安装它。从 Apache 网站下载。选择较新的版本。目前,许多人正在使用 Maven 2.21 或最近发布的 Maven 3。下载你想要使用的版本,然后将其解压到你选择的目录。或者,一些操作系统在其软件包系统中提供了 Maven 2 构建版本(以及很快将提供的 Maven 3 构建版本)。例如,在 Ubuntu 上,你可以运行 sudo apt-get install maven2
。如果你正在使用 SpringSource Tool Suite(可在此免费下载),那么你无需担心,Maven 已经下载并包含在你的 STS 安装文件夹中。无论你如何在系统上获取 Maven 二进制文件,请确保该二进制文件在你的操作系统的搜索路径中。通常,这只需要将 Maven 安装目录的 bin
文件夹添加到操作系统的 PATH
变量即可。为 Maven 安装本身创建一个名为 MAVEN_HOME
的系统变量也是一个好习惯。在 Unix(包括 OS X)或 Linux 机器上,这个设置看起来大致相同。在我的机器(一台 Ubuntu Linux 机器)上,它看起来像这样
export MAVEN_HOME=/home/jlong/bin/springsource/maven-2.2.1.RELEASE export PATH=$PATH:$MAVEN_HOME/bin
要测试它,打开一个新的 shell 并执行以下命令
mvn --version
你应该会看到一些输出,确认该命令在你的系统上存在,如下所示
jlong@jlong-mbp:~/Desktop/code$ mvn --version Apache Maven 2.2.1 (r801777; 2009-08-06 12:16:01-0700) Java version: 1.6.0_22 Java home: /usr/lib/jvm/java-6-sun-1.6.0.22/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux" version: "2.6.35-22-generic" arch: "amd64" Family: "unix" jlong@jlong-mbp:~/Desktop/code$
Maven 入门
Maven 项目假定一个标准的目录结构,其最小结构如下所示
./pom.xml ./src ./src/main ./src/main/java ./src/main/resources ./src/test ./src/test/java ./src/test/resources
在目录结构的根部是一个 Maven 所期望的 XML 文件(总是命名为 pom.xml)。pom.xml
(POM 是 Project Object Model 的缩写)描述了你的项目特有的、无法自动推断的内容,如依赖项、项目名称等。
目录 | 描述 目录内容(相对于项目根目录) |
---|---|
src/main/java | 包含项目的 Java 源代码 |
src/main/resources | 包含项目的所有类路径相关资源(例如,Spring 应用程序上下文 .xml 文件) |
src/test/java | 包含测试的 Java 源代码…Spring Roo 1.1.1 的新特性我们很高兴宣布 Spring Roo 1.1.1 正式发布。这个新版本包含了 超过 250 项修复和增强,其中包括许多性能和功能改进。 一如既往,SpringSource Tool Suite (STS) 2.5.2 将很快发布并集成此新版本的 Spring Roo。你也可以下载 Spring Roo 1.1.1 的独立版本并立即开始使用。 让我们简要浏览一下我们在 Roo 1.1.1 中添加的一些更值得注意的增强功能。如果你正在升级基于 Roo 的项目,我们建议你查阅我们在参考指南中包含的特定版本升级注意事项。参考指南也包含在… Spring Web Services 2.0 发布经过近一年的开发,我很高兴宣布 Spring Web Services 2.0 已发布!在这篇文章中,我想介绍一些主要的新功能。 需要 Java 5+ 和 Spring 3.0您可能知道,我们将对象 XML 映射 (OXM) 模块从 Spring-WS 项目移至 Spring 3.0。因此,由于 org.springframework.oxm 包中存在冲突的类,将 Spring-WS 1.5(及其自己的 OXM 模块)与 Spring 3.0 一起使用有点问题。 从 2.0 版本开始,我们不再将 OXM 模块作为 Spring-WS 的一部分发布,而是依赖于 Spring 的 OXM。因此,Spring Web Services 2.0 需要 Spring 3.0 才能工作。通常,我们在版本要求方面会更宽松一些,不一定要求最新的 Spring 版本,但这是… SpringSource Tool Suite 2.5.2 发布Green Beans: Spring 在服务层入门所有应用程序都源于领域模型。“领域模型”这个术语描述了系统中对你尝试解决的问题很重要的名词或数据。服务层——业务逻辑所在的地方——操作应用程序数据,并且最终必须将其持久化(通常在数据库中)。解释很简单,但在实践中,构建一个好的服务层对任何开发者来说都是一项艰巨的任务。本文将向开发者介绍 Spring 框架中可用于构建更好服务层的选项。假定读者对……有一定的经验 |