Spring 2.5 的全面注解支持

工程 | Juergen Hoeller | 2008 年 1 月 28 日 | ...

Spring 2.5 背后的核心主题之一是全面的基于注解的配置。我们一直在讨论和撰写大量关于 @Autowired、Spring MVC 的 @RequestMapping 的博客,以及对使用 JUnit4 或 TestNG 编写的带注解测试的新支持。@Autowired 无疑是 Spring 2.5 的核心注解,可用于服务组件、Web 组件、单元测试,甚至在使用 Spring 的 @Configurable 和 AspectJ 编织时的领域对象。Spring MVC 的 @RequestMapping 同样灵活,支持多种处理方法签名变体。

今天我……

Spring Dynamic Modules 达到 1.0 版本!

工程 | Adrian Colyer | 2008 年 1 月 25 日 | ...

好的,这比我们最初预期的要长得多,但我真的很高兴地说,Spring Dynamic Modules 项目今天达到了其 1.0 里程碑。当我第一次在 2006 年 9 月发布关于这个主题的帖子时("Spring OSGi 支持势头增强"),最初的规范只是 Spring Framework 的一个问题附件,与更广泛的 OSGi 社区的联系才刚刚开始建立。

快进十八个月,Spring Dynamic Modules 已成为 Spring 组合中的一个成熟项目,其提交者来自 SpringSource、BEA 和 Oracle。BEA 和 Oracle 都在使用 Spring Dynamic Modules 构建他们自己的基于 OSGi 的产品(例如,参见 "WebLogic Event Server - 我们为什么使用 Spring"),并且 Spring Dynamic Modules 讨论组已有近 1000 名成员。OSGi Alliance 本身也成立了一个 企业专家组……

Spring Dynamic Modules 1.0 来了

工程 | Costin Leau | 2008 年 1 月 25 日 | ...

我很高兴报告(与 Adrian 一起)经过 3 个里程碑和 2 个候选发布版后,Spring Dynamic Modules(之前称为 Spring OSGi)1.0 已正式发布

自我上一篇帖子(关于 1.0 M1)以来,许多功能得到了改进或增加;我将在未来的博文中更详细地讨论它们(还有参考文档详细解释了该库),所以我在此仅列举几点:

- 一致性

我们希望提供一个强大、简单且一致的编程模型。这就是 Spring Dynamic Modules 构建在 Spring 之上,并利用其久经考验的概念、可靠性和普适性的原因。

- 高度非侵入性

推荐使用 Spring DM 的方式是不要在你的代码中使用它的类,也不要在你的 Bundle 清单文件中导入它们。如果你不在代码中使用 Spring,只将其用于应用程序配置,同样的规则也适用。Spring DM 会为你创建应用程序上下文,因此你无需依赖 Spring 或 Spring DM。而且不用担心自定义命名空间或 XML Schema 之类的事情,我们已经涵盖了这些。

- OSGi 服务动态生命周期管理

这是 Spring DM 最重要的特性之一——能够像与普通 Bean 一样与 OSGi 服务交互。你无需编写任何代码即可发布和消费 OSGi 服务;我们将为你处理这些动态变化——并且你拥有完全的控制权(将来会详细介绍)。

- 更智能的集成测试框架

由于我们在内部广泛使用 Spring-DM 集成测试,我们改进了默认设置、Maven 集成,并使自动清单生成比以前更快、更智能。例如,该框架会自动确定测试 Bundle 中可用的类,并且不会为其生成导入语句。

- 简单的 Bundle 交互

Andy Piper(博客)添加了一种简单、声明式的方式,根据模块生命周期和 Spring Bean 依赖关系来安装/启动/停止/更新 Bundle。

- 受管的启动/关闭上下文创建

在 OSGi 中,应用程序被分解成各种模块(也称为 Bundle),它们相互依赖于彼此的服务。这在模块之间创建了一个依赖树,这在启动和关闭过程中变得非常重要。传统上,这可以通过根据依赖顺序安装和启动 Bundle 来解决,然而,这并不能完全解决问题。正如 OSGi 规范建议的那样,初始化时间长的 OSGi 服务(例如连接池)应该依赖于与用于启动和停止 Bundle 的线程不同的线程。这意味着,如果一个 Bundle 已启动,并不代表其服务也已可用。而且并非每个应用程序都准备好在启动期间等待所需的服务——事实上,很少有这样做。这意味着一个 Bundle 将会失败,因为它依赖的服务在几毫秒后才发布(OSGi 默认是一个虚拟机内平台,其中事情发生得非常快)。

这种行为并非罕见——事实上,在多核平台和多个 Bundle 同时启动时,这种情况非常普遍。Spring DM 通过确定依赖关系(从 Spring 配置中获取)并在它们可用后才创建应用程序上下文来解决这个问题。在关闭时也会采用类似的过程,Spring DM 将根据依赖顺序停止上下文,这样你就无需担心启动或停止你的 Bundle。

- 无线程依赖等待

我无法讨论依赖机制而不提及 Hal Hildebrand(参见他的博客)实现的用于依赖等待的“无线程”方法(我知道这听起来有点像矛盾修饰,我们正在为此想一个更好的名字)。由于各种服务需要可用才能使模块正常启动,因此需要某种形式的等待/监控,这传统上意味着使用一个线程。

然而,在一个 OSGi 平台上可能有(而且将来会有)多个模块(几十个很常见)——为每个模块使用一个等待线程根本无法扩展。我们努力改进这个模型,我相信我们提供了一个非常好的解决方案——在等待过程中完全使用线程。这意味着无论部署了 3 个 Bundle 还是 300 个,都不会消耗 CPU 时间,除非你的模块实际开始启动。

 

Spring Dynamic Modules 不仅仅是将一个 API “Spring 化”,而是处理一个不同的运行时环境。

 

在工具方面,Spring IDE 支持 Spring DM 命名空间,并且(感谢 Christian)还为 Eclipse PDE 提供了 Spring-DM 特定的目标,这些功能在 Spring IDE nightly builds 中可用(有关安装和使用插件的更多信息可在参考文档中找到)。

 

未来方向

 

既然 1.0 已经发布,下一步是什么?有很多领域需要涵盖:

Web 支持

OSGi 平台提供了专用的 Http 服务,但使用它需要编写代码。资源加载、JSP 生成和部署等事情可以大大简化。这是 1.1 版本的主要重点领域。

持久化

现代持久化工具提供了诸如延迟加载等高级功能,这些功能由于依赖于类生成和代理而会弯曲 OSGi 环境强制执行的模块边界。我们希望解决这个问题,并像 Web 支持一样,在使用纯 JDBC 或/和 ORM 工具时提供流畅的体验。

AOP

继持久化问题之后,我们正在寻找在 OSGi 内部进行通用 AOP 的解决方案。这是一个难题,要正确实现它,需要内部 OSGi 平台的支持。好消息是,像 Equinox Aspects 这样的项目已经开辟了道路,并且 OSGi 企业专家组 (EEG) 也已将此问题提上议程。

 

说够了

 

如果你想了解更多关于 Spring Dynamic Modules 的信息,请查看项目页面和参考文档,并务必使用我们的邮件列表(论坛即将上线)。此外,最近我们制作了一些 OSGi/Spring DM 截屏视频,这些视频可在 Spring DM 主页上找到。第一个视频(分为两部分),由我亲自制作,展示了如何快速创建一个项目,以便使用 Spring DM 进行集成测试。
为什么是集成测试?因为使用 Spring DM,这是一个非常简单快捷的过程,也是学习 OSGi 的非常有效的方式(尤其是在模块化方面)。

未来会有更多截屏视频——请告诉我们你想看什么,我们将根据请求数量进行安排。

事不宜迟,"使用 Spring DM 进行 OSGi 集成测试"

 

领域对象依赖注入功能的新改进

工程 | Ramnivas Laddad | 2008 年 1 月 24 日 | ...

Spring 的依赖注入(DI)机制允许配置在应用程序上下文中定义的 Bean。如果你想将同样的想法扩展到非 Bean 对象怎么办?Spring 对领域对象 DI 的支持利用 AspectJ 编织将 DI 扩展到任何对象,即使它是由 Web 或 ORM 框架创建的。这使得创建具有丰富领域行为的对象成为可能,因为领域对象现在可以与注入的对象协作。在这篇博客中,我讨论了 Spring Framework 在这一领域的最新改进。

领域对象 DI 背后的核心思想非常简单:一个 AspectJ 编织的切面选择对应于符合特定规范的任何对象的创建反序列化的连接点。对这些连接点的通知将依赖项注入到正在创建或反序列化的对象中。当然,细节决定成败。例如,如何选择对应于反序列化的连接点,或者如何确保每个对象只注入一次依赖项?通过提供一些预先编写的……

Spring 技能要求超越 EJB

工程 | Rod Johnson | 2008 年 1 月 24 日 | ...

招聘信息是衡量技术真正采用程度的良好指标。它们表明公司是否正在投入资金,从而能够区分实质与炒作;它们表明开发者掌握和增长相关技能的重要性(这是技术延续的重要因素);并且它们为公司采用特定技术的安全性提供了良好的指导。

因此,Indeed.com 的 jobtrends 网站(一个招聘信息聚合网站)是一个重要的资源。它允许跟踪招聘需求数量随时间变化的趋势,以及……

SpringSource 认证计划

工程 | Daryl Heinz | 2008 年 1 月 17 日 | ...

注:此帖子已编辑,以反映 Spring 迁移至 Pivotal。关于Spring 培训与认证的最新博客可在此处查看。

自从六个月前我加入 SpringSource 担任培训总监以来,我一直听到一个持续的需求。基于全球范围内对 Spring 技能日益增长的需求,开发者和顾问们正在寻求可量化的方式来展示他们的 Spring 专业知识。同样,这些需求背后的招聘经理们也在要求推出认证计划,以帮助识别和招聘具备立即有用、基础 Spring 知识的技术人员。

正如 Spring 项目团队回应开源社区需求的方式一样,我们也做出了回应,并高兴地宣布推出 SpringSource 认证计划。该计划于本月(2008 年 1 月)启动,首个认证是 Spring Framework Professional……

采纳的力量:为什么没有公司强大到足以拒绝开发者想要的东西

工程 | Rod Johnson | 2008 年 1 月 16 日 | ...

当我们在伦敦完成首届年度 Spring eXchange 时,这真是新闻不断的一天。首先,Sun Microsystems 收购 MySQL 的消息,然后是期待已久的 Oracle 收购 BEA Systems 的消息。在进一步评论之前,我想祝贺我们在 MySQL 的所有朋友,特别是 Mårten Mickos,以及我们在 BEA 的所有朋友。这个行业的整合趋势正在加强。

作为一家开源公司,我们很高兴看到 MySQL 因其努力而获得回报。我们看到了 Mårten 和他的同事们在构建他们的软件、社区和强大……

Tony Hoare 生日快乐

工程 | Rod Johnson | 2008 年 1 月 14 日 | ...

上周五是 Tony (C.A.R.) Hoare 的生日。谁是 C. A. R. Hoare?如果你是一名程序员,你可能熟悉快速排序(Quicksort)——一种优雅且出奇简单的排序算法,在大多数情况下速度极快。如果你学习过计算机科学,你几乎肯定在无数种语言中实现过快速排序,并且会认出此页面上的动画。Hoare 于 1960 年发明了快速排序,它现在是使用最广泛的排序算法。快速排序动画

除其他贡献外,Hoare 还发明了用于指定交互的通信顺序进程 (CSP) 语言……

捕获故障和系统状态(第一部分)

工程 | Alef Arendsen | 2008 年 1 月 7 日 | ...

在 Spring Experience 大会上,我主持了一场关于多个方面的会议。其中一个是我上周描述的Hibernate 同步切面。另一个是能够捕获首次故障和系统状态的切面,有时称为首次故障数据捕获 (FFDC)。我主持这场会议是为了展示一些非常有用的切面,但人们可能在实践中尚未遇到过。我经常听到人们询问除了日志记录、跟踪、事务管理和安全性之外的切面。我认为 Hibernate 同步切面和 FFDC 切面都是很好的例子。

引言

FFDC 的目标是在错误发生时捕获尽可能多的关于系统当前状态的信息。以下条目解释了这个切面如何工作以及如何在您自己的应用程序中使用它。

让我们……

在 JDBC 操作之前,刷新 Hibernate Session(包含 TSE 示例代码)

工程 | Alef Arendsen | 2008 年 1 月 4 日 | ...

在同一个事务中混合使用对象关系映射器 (ORM) 的代码和不使用 ORM 的代码,可能会导致数据在底层数据库中本应可用时却不可用的问题。由于这种情况我偶尔会遇到,所以我认为如果我写下解决这个问题的方法,对大家都会有帮助。

简而言之:本帖其余部分将介绍一个切面,该切面触发底层持久化机制(JPA、Hibernate、TopLink)将任何脏数据发送到数据库。

顺便说一句,我在去年 12 月 Spring Experience 大会 的一个环节中展示了这个切面,这篇帖子也包含了源代码,供你们……

订阅 Spring 新闻通讯

订阅 Spring 新闻通讯,保持联系

订阅

领先一步

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

了解更多

获取支持

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

了解更多

近期活动

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

查看全部