Sun 的 GlassFish 拥抱 Spring

工程技术 | Rod Johnson | 2007年2月16日 | ...

如今,Sun 非常认真地对待开源,用户似乎也开始认真对待 Sun 的开源项目了。

GlassFish 在开源应用服务器领域起步较晚,但似乎正在获得关注。更重要的是,它实际上看起来相当不错。包括 Costin 和 Juergen 在内的多位 Interface21 成员都对 GlassFish 进行了评估,并给予了肯定(尽管我们尚未在生产环境中使用过它)。据我所知,性能非常出色——这很可能主要归功于基于 NIO 重写后的 Servlet 引擎。其 JPA 实现——TopLink…

WebLogic 10 技术预览版发布 - 构建于 Spring Framework 之上

工程技术 | Rod Johnson | 2007年2月11日 | ...

恭喜 WebLogic 团队发布了 WebLogic 10 预览版,该版本通过了 Java EE 5 CTS。很高兴看到 BEA 在经历了 J2EE 1.4 的失策之后,重新回到了他们快速行动的传统。

这对于 Spring 社区来说是一个有趣的消息,因为 WebLogic 10 内部使用了 Pitchfork。Pitchfork 项目是一个由 Interface21 领导并与 BEA 合作开发的开源项目,它在 Spring 之上实现了 EJB 3.0 拦截和 JSR-250 注入。它被用于 WebLogic 10 EJB 容器内部以及服务器的其他部分,以满足新的…

Acegi 这个名字从何而来?

工程技术 | Ben Alex | 2007年1月25日 | ...

考虑到 Rod 最近关于 Interface 名称起源的博客、最近关于 Acegi Security 改名的讨论串,以及去年底同事 Ben Hale 关于撰写“Acegi”名称起源博客的建议,我决定是时候写一篇了!

首先,发音是:“ah-see-gee”。既然我们已经解决了这个问题,下面来说说它来自哪里

  • 回到上世纪 90 年代初,我创办了一个电子布告栏系统 (BBS)。我仍然记得使用我的第一台 300 波特调制解调器,并亲眼看着字符以和我阅读速度相同的速度出现!无论如何,BBS 需要一个名字,我非常喜欢“Midnight BBS”(或者是“Lightning BBS”?)。在尝试向澳大利亚 BBS 注册机构注册我喜欢的名字后,我接到电话被告知该名称已被占用。我搜索了另一个名字,没有发现冲突,并更改了所有的屏幕(有人还记得 Avatar 吗?)。然后我去用新名字注册 BBS,尽管其他人刚刚抢在我之前注册了同一个名字。当时澳大利亚大约有 800 个 BBS——竞争非常激烈!所以,我决定选择一个保证原创的名字:取自英文字母的第 1、3、5、7 和 9 个字符。于是 Acegi BBS 就诞生了。
  • 那是 BBS 的鼎盛时期。它拥有来自澳大利亚各地的呼叫者,也是我们区号中第一个拥有 CD-ROM 似乎无限容量的 BBS。我成为了 Fidonet 的 3:624 网络协调员,并协助在我们区域分发“echomail”。不久之后,人们开始寄送抬头为“Acegi BBS”的支票,因为他们想要更高的文件下载限制和访问 Fidonet 的 netmail。
  • 因为我需要兑现名字中包含“Acegi”的支票,所以在 1993 年初我们决定注册一个公司名称。Acegi Computer Technology 被选中,人们也乐意相应地填写支票抬头。
  • 大约在 1995 年,我因工作搬到了悉尼。拨号上网刚刚开始在澳大利亚向公众开放(调制解调器接入每小时仍然需要大约 5 美元!)。由于 BBS 的大多数用户来自特定的本地区域,而我正要离开那个区域,所以我把 Acegi BBS 交给了一个朋友继续运营。他后来也搬家了,又把 BBS 转给了另一个朋友。之后我就失去了联系。我在 Google 上搜索了“Acegi BBS”,甚至找到了一个1995 年的旧记录
  • 到了 1996 年,我需要一个公司来处理我的 IT 项目,于是 Acegi Technology Pty Limited 诞生了。自那以后,它一直运营至今。
  • 大约在 2003 年 11 月,我写下了最终成为 Acegi Security 的东西。我把它打包成 ZIP 文件发给了 Rod 和 Juergen。我提议新项目命名为“Spring Security”。然而,他们当时没有时间全面审查,所以建议我先简单地将其发布为“_____ Security System for Spring”。于是,我在名称前加上了“Acegi”。截至今天,在 Google 上搜索“Acegi”大约有 66 万个结果,其中几乎所有都与这个安全框架有关。
现在怎么办?名称的下一阶段是一个“分叉”。虽然 Acegi Technology Pty Limited 将继续运营,但 Acegi Security 将更名为“Spring Security”。我们进行改名有几个充分的理由。然而,这不仅仅是一个改名行动。实际上,这是一个重新定位,将 Acegi Security 更深入地整合到 Spring 的产品组合中。

对于那些还没听说过 Spring 产品组合的人,未来几个月你们会听到更多相关信息。Spring 实际上是一个由相关产品组成的家族,它们在技术和文化层面具有可比性。Spring 产品组合中的每个产品都具有一致的架构质量、关键设计模式、代码库、文档、测试覆盖率、友好的社区、开源许可、集成的示例、发布路线图以及来自 Interface21 的商业服务(如深入培训和支持)的可用性…)

动态数据源路由

工程技术 | Mark Fisher | 2007年1月23日 | ...

Spring 2.0.1 引入了 AbstractRoutingDataSource。我认为它值得关注,因为(根据客户常问的问题)我预感有相当一部分“自制”的解决方案正在流传。考虑到它实现起来微不足道但又容易被忽视,现在我有几个理由来清理一下我的团队博客角落了。

其基本思想是,一个路由 DataSource 充当中间层——而“真正”的 DataSource 可以在运行时根据查找键动态确定。一个潜在的用例是确保标准 JTA 不支持的特定于事务的隔离级别。为此,Spring 提供了一个实现:IsolationLevelDataSourceRouter

Spring IDE 动力十足

工程技术 | Rod Johnson | 2007年1月22日 | ...

上个月参加 Spring Experience 大会玩得很开心。一个愉快的惊喜是 Spring IDE 团队最近所做的工作范围。我在会议上几次遇到 Spring IDE 开发者 Christian Dupuis,似乎每次他都实现了一个新功能…)

即将发布的 Spring IDE 2.0 版本是全面更新,以匹配 Spring 2.0 中的新特性。Spring IDE 团队在两个重要项目上取得了巨大进展:XML 扩展命名空间和 AOP 增强。(顺便说一下,如果你想知道我为什么有一段时间没有发文,那是因为我花了很多时间在 InfoQ 上撰写一篇 Spring 2.0 更新文章…)

使用 AJAX 和 Spring 集成将 Java 编译为 JavaScript

工程技术 | Ben Alex | 2007年1月22日 | ...

一段时间以来,我一直对以客户端为中心、基于 Web 的用户界面很感兴趣。这些第四代框架的特点是其基于组件、事件驱动的编程模型,并专注于将表现层逻辑完全驻留在客户端。以这种方式针对 Web 浏览器通常需要使用 JavaScriptFlash,这本身就带来了一些独特的挑战。

如果我们能用 Java 编程并自动生成 JavaScript 或 Flash 运行时模块,就可以解决其中的许多挑战。目前实现这一目标的两个知名产品分别是 Google Web Toolkit (GWT) 和 Open Laszlo。两者都在 OSI 批准的许可下可用,并且拥有活跃的社区,同时也有各自独特的复杂性。一个需要考虑的问题是它们在多大程度上实现了提供一个针对 Web 浏览器部署的透明 Java 开发环境的目标。这个考虑因素涉及多个方面,包括 IDE 支持、调试集成、反射能力、运行时组件绑定等等。所有这些…)

在 Ubuntu 上安装 WebSphere Application Server 6.1

工程技术 | Rob Harrop | 2007年1月19日 | ...

最近我一直在与一位客户合作处理 WAS 6.1 相关的工作。鉴于我们有很多在 WAS 上使用 Spring 的用户,并且我需要测试应用程序,我决定是时候在我的一台工作笔记本上安装并运行 WAS 了。我说“一台”是因为我目前同时使用我的 Mac(安装 OSX)和我的 ThinkPad(安装 Ubuntu)——最近我主要在使用 ThinkPad,因为我可以让 Oracle XE 和 WAS 在无需使用 Parallels 这样的虚拟机工具的情况下运行。我仍然更喜欢 Mac,但老实说,日常使用上差别不大——我只是想念一些更有用的 Mac 工具,比如 SpotlightQuicksilverTextMateNewsFire

总之,回到主题——在 Ubuntu 上安装 WAS 6.1。我使用的是 Ubuntu Edgy,我的第一次安装尝试完全失败了,我怎么也想不明白原因。幸运的是,快速 Google 搜索找到了这篇文章。我完全不知道/bin/sh被链接到了 dash 而不是 bash——他们到底是怎么想的。我不太喜欢建议的解决方案,即运行安装程序,让它失败,然后更改安装目录中的所有脚本。相反,我只是重新链接了/bin/sh通过一个快速的sudo unlink /bin/sh然后是sudo ln -s /bin/bash /bin/sh。之后,安装程序就像做梦一样顺利运行,我在大约 15 分钟内就完成了 WAS 安装并启动了。

即使我的 ThinkPad 同时运行着 Oracle XE,WAS 运行得也相当快。WAS 最好的地方之一是它提供的工具(管理控制台、命令行工具)非常强大。管理控制台的性能尤其引人注目——许多其他服务器的控制台速度慢得令人痛苦。

一座太远的桥

工程技术 | Rob Harrop | 2007年1月16日 | ...

在我上一篇博文中,我介绍了一种创建策略类的方法,该方法充分利用了应用程序中存在的任何泛型元数据。在那篇文章的末尾,我展示了这段代码片段

EntitlementCalculator calculator = new DividendEntitlementCalculator();
calculator.calculateEntitlement(new MergerCorporateActionEvent());

你会记得DividendEntitlementCalculator被定义为

public class DividendEntitlementCalculator implements EntitlementCalculator<DividendCorporateActionEvent> {

    public void calculateEntitlement(DividendCorporateActionEvent event) {

    }
}

因此,将MergerCorporateActionEvent的实例传递给calculateEntitlement方法是不正确的DividendEntitlementCalculator类。然而,正如我在上一篇博文中所说,这段代码可以编译。为什么?因为EntitlementCalculator.calculateEntitlement()被定义为接受任何继承自CorporateActionEvent的类型,所以它应该能够编译。那么在这种情况下,运行时会发生什么,Java 是如何强制执行类型安全的呢?正如你可能想到的,运行这段代码会得到一个ClassCastException,表示你无法将MergerCorporateActionEvent转换为DividendCoporateActionEvent。通过这种方式,Java 可以为你的应用程序强制执行类型安全——不可能将MergerCorporateActionEvent潜入预期接受DividendCorporateActionEvent的方法中。

这里真正的问题是:“那个ClassCastException来自哪里?”答案很简单——Java 编译器通过引入一个桥接方法(bridge method),适当地添加了创建并抛出异常的代码。桥接方法是编译器生成的合成方法,会添加到你的类中,以确保在处理泛型类型时的类型安全。

在上面所示的例子中EntitlementCalculator.calculateEntitlement可以接受与CorporateActionEvent类型兼容的任何对象进行调用。然而,DividendEntitlementCalculator只接受与DividendCorporateActionEvent类型兼容的对象,但是,由于你可以通过DividendEntitlementCalculator接口调用EntitlementCalculator,它也必须接受CorporateActionEvent。那么这在编译后的类文件中会变成什么样呢?我们有用户提供的方法

public void calculateEntitlement(DividendCorporateActionEvent event) {
    System.out.println(event);
}

这会转化为这段字节码

public void calculateEntitlement(bigbank.DividendCorporateActionEvent);
  Code:
   Stack=2, Locals=2, Args_size=2
   0:   getstatic       #2; //Field java…

使用 Stub 和 Mock 进行单元测试

工程技术 | Dave Syer | 2007年1月15日 | ...

前几天我在客户现场,他们问了我关于单元测试和模拟对象的问题。我决定将我们讨论的一些内容整理成一个教程,介绍如何为单元测试创建依赖项(协作者)。我们讨论了两种选择,即 stubbing 和 mock objects,并提供了一些简单的例子来说明它们的用法以及两种方法的优缺点。

在单元测试中,通常会对被测类的协作者进行 mock 或 stub,以便测试不依赖于协作者的具体实现。这对于…来说也是一项很有用的能力。)

Spring 2.0 有什么新酷特性?

工程技术 | Ben Alex | 2006年12月17日 | ...

上个月,Rod Johnson 在三次澳大利亚 Spring 用户组会议上做了一个题为“Spring 2.0 有什么新酷特性”的演讲。Rod 在会议中提到我会提供他的演讲稿,所以就在这里

还有一些最近的演讲,也有人通过邮件询问我。按随机顺序,这里是最新的

希望参加过这些演讲的朋友们喜欢。

订阅 Spring 通讯

订阅 Spring 通讯,保持联系

订阅

领先一步

VMware 提供培训和认证,助你加速进步。

了解更多

获取支持

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

了解更多

即将举行的活动

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

查看全部