WEB开发网
开发学院软件开发Java Groovy 使 Spring 更出色,第 2 部分: 在运行时改... 阅读

Groovy 使 Spring 更出色,第 2 部分: 在运行时改变应用程序的行为

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 清单 1. PdfGenerator 接口、实现和配置//PdfGenerator.javapublicinterfacePdfGenerator{byte[]pdfFor(Invoiceinvoice);}//GroovyPdfGenerator.groovyclassGroovyPdfGen


清单 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 都不需要知道这种变化。

上一页  1 2 3 4 5 6 7  下一页

Tags:Groovy Spring 出色

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接