Groovy 使 Spring 更出色,第 2 部分: 在运行时改变应用程序的行为
2009-11-19 00:00:00 来源:WEB开发网
清单 1. PdfGenerator 接口、实现和配置
// PdfGenerator.java
public interface PdfGenerator {
byte[] pdfFor(Invoice invoice);
}
// GroovyPdfGenerator.groovy
class GroovyPdfGenerator implements PdfGenerator {
String companyName
public byte[] pdfFor(Invoice invoice) {
...
}
}
// applicationContext.xml
<lang:groovy id="pdfGenerator"
script-source="classpath:groovierspring/GroovyPdfGenerator.groovy">
<lang:property name="companyName" value="Groovy Bookstore"/>
</lang:groovy>
到目前为止,一切良好。您有一个名为 pdfGenerator 的 bean,它是用 Groovy 实现的,位于应用程序 CLASSPATH 中。当创建 Spring 应用程序上下文时,Spring 读取脚本,将它编译成 Java 类,并在应用程序上下文中实例化一个 GroovyPdfGenerator。任何其他依赖 pdfGenerator 的类只需将它声明为一个依赖,Spring 会将它们连在一起。
Spring 如何检测脚本修改
在内部,Spring 使用一个 Spring AOP RefreshableScriptTargetSource 拦截对目标对象(pdfGenerator bean)的调用,执行重新装载检查,并获取一个更新版本的 bean。基本上,依赖可刷新 bean 的 bean 都拥有对一个 AOP 代理而不是 bean 本身的引用。
事情变得真正有趣起来。假设您经常要在应用程序正在运行时对 PDF 生成代码进行更改,并使这些更改立即生效。Spring 使得这种功能的添加变得很简单。您只需为定义 bean 的 <lang:groovy> 元素添加 refresh-check-delay 属性。该属性定义一个毫秒数,每过这么长时间,Spring 检查对底层 Groovy 脚本的更改。如果检测到对脚本的更改(例如,自上次检查后,.groovy 脚本上的时间戳被改变),那么 Spring 读取脚本,编译它,并用新的版本替换 旧的 pdfGenerator bean。Spring 这样做时,任何使用 pdfGenerator 的 bean 都不需要知道这种变化。
更多精彩
赞助商链接