Spring Data JPA 快速入门

工程 | Oliver Drotbohm | 2011年2月10日 | ...

随着 Spring Data JPA 项目的第一个里程碑版本的发布,我想快速介绍一下它的特性。你可能知道,Spring 框架提供了构建基于 JPA 的数据访问层的支持。那么 Spring Data JPA 在这个基础支持上增加了什么呢?为了回答这个问题,我想先介绍一下使用纯 JPA + Spring 实现的示例域的数据访问组件,并指出可以改进的地方。完成这些后,我将重构实现,使用 Spring Data JPA 的特性来解决这些问题……

Spring Android 和 Maven (第2部分)

工程 | Roy Clarkson | 2011年2月9日 | ...

Spring Android and Maven (Part 1) 中,我描述了如何使用 Maven 从命令行构建 Android 应用。在本文中,我将展示如何使用 Maven 依赖管理从 Eclipse IDE 构建 Android 应用。该应用还将展示 Spring Android 1.0.0.M2 中的最新特性,该版本于本周发布。

概述

Maven Android 插件允许你使用 Maven 构建 Android 应用并受益于依赖管理。Google 的 Android 开发工具 (ADT) 插件允许你在 Eclipse IDE 中开发和构建 Android 应用。要在 Eclipse 中使用 Maven 依赖管理,需要 Maven Integration for Android Development Tools 插件,它集成了 m2eclipse、ADT 插件和 Maven Android Plugin

本周 Spring 动态:2011年2月8日

工程 | Josh Long | 2011年2月8日 | ...

对于 Spring 社区来说,这又是激动人心的一周。社区似乎对新的 Tomcat 版本、移动客户端、Spring Data 和大数据(例如 Spring Gemfire、Redis 以及 Spring Data 项目本身)议论纷纷。

提醒:Juergen Hoeller - Spring 核心框架的负责人,也是所有相关 Spring 项目的贡献者之一 - 将举办两场内容相同的网络研讨会 - 一场针对北美一场针对欧洲 - 介绍 Spring 3.1 中的新特性,就在两天后(2月10日)!务必报名参加这场免费网络研讨会,了解这个最广泛使用的 Java 框架的下一次迭代!

这是一场创纪录的活动,提前报名人数惊人。虽然还没有 Spring 3.1 的二进制文件(但很快就会有;敬请期待!),但 Spring 项目的代码随时供你使用,所以 - 如果你和我一样对所有新特性感到兴奋 - 你就可以观看这场网络研讨会,并早早地开始使用它……

本周 Spring 动态:2011年2月1日

工程 | Josh Long | 2011年2月2日 | ...

本周社区的进展令人着迷,发展势头迅猛。不管你看向哪里,激动人心之处要么在于更新、更前沿的技术,如 Spring Data、Gemfire 和 Virgo,要么在于对现有技术的精彩改进,如 Tomcat 和 SpringSource Tool Suite。无论如何,本周有很多内容需要消化,所以我们开始吧!

  1. SpringSource Tool Suite 2.6.0.M1 已发布。这个新版本改进了内容辅助和快速修复,为基于 Spring MVC @RequestMapping 的应用提供了新的向导和视图。它还改进了 Groovy 的内容辅助性能,并改进了 Groovy 的语法高亮。
  2. Spring Data Graph - Neo4j Support 1.0.0.M2 发布。这个新版本有许多新特性,包括改进的索引支持 - 对节点和关系提供完整的命名索引支持,移除节点和关系实体,根据类型策略,对框架方法实例化实体时进行严格类型检查,支持动态投影到任意图实体,以及对 Neo4j 1.2 的新更新支持。
  3. Shekhar Gulati 在 IBM 的 DeveloperWorks 上发表了一篇介绍 Spring Roo(第1部分,从源代码构建) 的文章。
  4. Tomcat 项目的高级贡献者 Mark Thomas,写了一篇关于如何在 Tomcat 7 中防止跨站脚本 (XSS) 攻击的文章
  5. VMware vFabric GemFire 团队刚刚制作了一个视频,演示如何设置 GemFire 的 Hibernate Cache Module。视频演示了如何在 Maven 中配置该模块,然后演示了它在基于 Spring-DAO 的实现中的使用。最后,演示了使用 Spring Insight 监控应用性能的过程。这是一项很棒的技术,这个视频也很棒!
  6. Sebastian Pietrowski 发表了一篇关于 Spring Data Redis 的精彩入门文章
  7. Shekhar Gulati 贡献了另一篇很棒的文章 - 也是关于 Spring Data 和 RedisSpring Data 是许多技术的总称,这些技术旨在支持更专业化的数据持久化需求。其中很大一部分是对当今许多 NoSQL 数据存储的深度支持,以及对基于 JDBC 的持久化的更专业支持。
  8. Java Code Geeks 发表了一篇关于 使用 Spring AOP 进行面向切面编程 的精彩文章
  9. Jose Delgado 写了一篇关于 如何在 Spring Roo 中配置应用以处理两个数据库 的精彩文章。
  10. Sivaprasadreddy Katamreddy 又来了,这次是关于将控制反转和依赖注入应用于方法设计
  11. Glyn Normington 发推说 Eclipse Virgo 内核首次成功运行 在使用了 OSGi 4.3 框架钩子实现的区域有向图上。祝贺!Eclipse Virgo 是之前名为 SpringSource dm Server 的新改进版本的名称。
  12. David Dossot 转发了一篇有趣的帖子,探讨了

    Activiti BPMN 2 引擎 使用 Spring,发表于上个月早些时候。

  13. 随着 Tomcat 6 和 7 的所有激动人心的新闻,很容易忘记 Tomcat 5 仍在更新和支持中。Tomcat 5.5.32 也刚刚发布了!

Green Beans:企业消息和 Spring 快速入门

工程 | Josh Long | 2011年1月26日 | ...

在本文中,我们将介绍消息的核心概念,以及 Spring 框架及其相关项目提供的对各种类型消息的丰富支持。

什么是消息?为了更好地解释这一点,我将转述 Gregor Hohpe 和 Bobby Woolf 的开创性著作 Enterprise Integration Patterns(Addison Wesley,2004年)中提供的例子。当你拨打电话时,你试图向另一方传递信息。这只有在拨打电话时对方可用才行。由于并非总是能接到电话,我们使用语音信箱来排队存储消息。呼叫者将消息留在语音信箱中,而接收者可以在稍后异步地检索该消息(甚至多个消息)。

在那个例子中,一个语音信箱位于双方中间。它存储消息,然后在接收者(即被呼叫方)检索时传递它。在企业消息的世界里,情况也非常相似:一方将消息发送给消息代理(也称为面向消息的中间件 – MOM),另一方(当它可用时)接收或明确查询消息代理中的任何消息。

到这里,这个类比就不太适用了。消息代理与语音信箱不同,有很多选项。消息代理非常适合提供额外服务,如路由,并对消息传递提供保证。消息代理可以针对不同的用例进行优化,例如,你可以牺牲速度换取持久性。消息代理可以将消息持久化到外部存储以确保持久性,尽管这通常是一个可以在追求速度时关闭的配置。

在语音信箱的例子中,消息由一方发送,然后传递给另一方 – 这种通信是点对点的。消息代理支持这种模式,以及另一种称为发布-订阅的通信类型,在这种模式下,消息被传递给多个客户端。

消息代理的一个常见用途是解决两个不同系统之间的集成问题。发送到消息代理的数据通常是发送方和接收方都通用的格式。两个系统要使用消息代理,唯一需要达成一致的是数据契约。消息通常有一个消息体,其中存储着消息本身的内容,还有消息头,消息头是提供关于消息体元数据的键/值对,可用于帮助消息消费者处理消息。消息头可以是任何你想要的东西,但它们通常与消息本身或消息处理器相关。

Java Message Service

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 实例表示。

[caption id="attachment_7506" align="alignnone" width="573" caption="上图中,蓝色元素代表生产者和消费者。橙色元素代表代理中缓冲消息的目的地。在 JMS 中,这些是主题或队列。"][/caption]

Destination 是一个接口,它有两个更具体的子接口:javax.jms.Queuejavax.jms.Topic。一个 Queue 代表一个标准队列,它是一种如前所述的点对点结构。一个 Topic 提供发布-订阅消息机制,并且可以将单个消息传递给多个接收者。

要将消息发送到 Destination,你必须创建一个 javax.jms.MessageProducer。然后可以使用该 MessageProducer 来发送 javax.jms.Message

JMS 支持两种不同的消息接收机制。第一种方式是请求消息,使用 javax.jms.MessageConsumer#receive() 方法,它以同步方式从 Destination 返回单个消息;默认情况下,该方法会阻塞直到接收到消息。除了使用 MessageConsumer,客户端可以通过调用 javax.jms.Session#setMessageListener(MessageListener) 来安装一个 javax.jms.MessageListenerMessageListener 是一个接口,只有一个方法 public void onMessage(javax.jms.Message),只要 javax.jms.MessageDestination 上有可消费的消息时,就会调用该方法。一个 MessageListener 提供异步消息处理:消息到达时,它们会被处理。

JMS API 中还有很多东西要学习,但这些类和概念在我们将要讨论的 Spring 对 JMS 消息的支持中会给你带来最大的帮助。第一层支持是 org.springframework.jms.core.JmsTemplate,它提供了简化方法,将我们刚刚讨论的内容简化为一行代码。JmsTemplate 需要一个 javax.jms.ConnectionFactory 实例来完成工作。JmsTemplate 可以为你做很多工作。例如,要发送消息,JmsTemplate 会建立一个 javax.jms.Session,设置一个 javax.jms.MessageConsumerjavax.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…

本周 Spring 动态:2011年1月18日

工程 | Josh Long | 2011年1月18日 | ...

对于整个 Spring 社区来说,又是美妙的一周。除了 Tomcat 7 稳定版的激动人心发布公告之外,社区中还有许多很棒的文章。

  1. 作为回归基础的“Green Beans”系列的延续,我们刚刚发表了一篇关于一起使用 Spring 和 Maven 的文章。
  2. Tomcat Expert 社区宣布了 Tomcat 7 的第一个稳定构建版本。我们知道 Tomcat 是 Spring 开发者运行应用的首选场所,所以务必查看最新特性。
  3. Nicholas Sankel 写了一篇关于将 Spring Roo 与 Vaadin UI 框架 一起使用的博客。
  4. Tomcat Expert 社区提供了一份 2010 年最受欢迎的 10 篇文章列表
  5. Tomasz Nurkiewicz 写了一篇精彩的博客,探讨了 如何在使用 Spring 框架时完全移除 XML 配置
  6. Sivaprasadreddy Katamreddy 写了一篇 Spring AOP 入门文章,该文章从有问题的代码逐步改进到使用 Spring AOP 的优化代码。
  7. 一位名叫 Warlock 的先生(据我所知)撰写了一篇关于 Spring MVC 基于注解的会话处理支持 的博客。
  8. Sal Peace 写了一篇精彩的入门文章,介绍了如何将 Spring MVC 3.0 的 portlet 支持与 WebSphere 7 一起使用。
  9. Viral Patel 写了一篇关于 在 Spring 3 MVC 和 Hibernate 中保存和检索 BLOB 对象数据 的教程。
  10. Jorram Barrez(来自 Activiti 项目)发表了一篇关于如何使用 Spring 连接 Activiti BPMN 2.0 业务流程到 EJB 业务服务 的文章。

Green Beans:Maven 和 Spring 快速入门

工程 | Josh Long | 2011年1月17日 | ...

Apache Maven 是一个流行的开源工具,它提供了约定优于配置的项目构建管理方法。事实上,Eclipse 社区调查显示 Maven 的采用率从 2009 年的 8% 增加到 2010 年的 28%,这强调了它在各种项目设置中的实用性。尽管你可以在不使用 Maven 的情况下使用 Spring,但仍有很多理由向 Spring 开发者推荐使用 Maven。在本文中,我将向你展示如何开始使用 Maven,以及如何成功地将其与 Spring 库、仓库以及诸如 SpringSource Tool SuiteSpring Roo 的工具一起使用。

Maven 处理项目构建。如果你的项目遵循 Maven 的约定,Maven 可以相对轻松地提供强大的功能和复杂性。它是声明式的;你描述你想要完成什么,而不是你想要如何完成它。如果你来自像 Make 或 Ant 这样历史悠久的构建工具,这种方法会让你觉得不同。

你在 Maven 项目配置中声明项目的依赖项。然后 Maven 会代表你解析并下载这些依赖项。这类似于许多不同操作系统中的包管理系统。假设你正在使用 OS X 的 finkports 命令行工具。要更新操作系统的某个功能,用户在管理客户端中选择一个包(比如最新的安全补丁,或者新版本的 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 包含项目中任何 classpath 相关的资源(例如 Spring 应用上下文 .xml 文件)
src/test/java 包含测试的 Java 源代码…

Spring Roo 1.1.1 新特性

工程 | Ben Alex | 2011年1月11日 | ...

我们很高兴地宣布 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 发布

工程 | Arjen Poutsma | 2011年1月11日 | ...

经过近一年的开发,我很高兴地宣布 Spring Web Services 2.0 已发布!在本文中,我想介绍一些主要的新特性。

要求 Java 5+ 和 Spring 3.0

你可能知道,我们已将 Object XML Mapping (OXM) 模块从 Spring-WS 项目移至 Spring 3.0 中。因此,将 Spring-WS 1.5(及其自带的 OXM 模块)与 Spring 3.0 一起使用会有些问题,因为 org.springframework.oxm 包中存在冲突的类。

自 2.0 版本起,我们不再将 OXM 模块作为 Spring-WS 的一部分发布,而是依赖于 Spring 的 OXM。因此,Spring Web Services 2.0 需要 Spring 3.0 才能工作。通常,我们在版本要求方面会比较宽松,不一定要求最新的 Spring 版本,但这(次情况)是…

Green Beans:在你的服务层中 Spring 快速入门

工程 | Josh Long | 2011年1月8日 | ...

所有应用都源自一个域模型。术语“域模型”描述了系统中与你尝试解决的问题相关的名词或数据。服务层(即业务逻辑所在的层)处理应用数据,并最终必须将其持久化(通常在数据库中)。解释很简单,但在实践中构建一个好的服务层对于任何开发者来说都可能是艰巨的任务。本文将向开发者介绍在 Spring 框架中可用于构建更好的服务层的选项。假定读者对…有一些经验。

订阅 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

更进一步

VMware 提供培训和认证,加速你的进展。

了解更多

获取支持

Tanzu Spring 通过一项简单订阅,提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

近期活动

查看 Spring 社区中的所有近期活动。

查看全部