Groovy 使 Spring 更出色,第 2 部分: 在运行时改变应用程序的行为
2009-11-19 00:00:00 来源:WEB开发网清单 11 中的 DatabaseScriptSource 非常简单,不过您可以让它要求的数据库表结构更加通用。它假设一个名为 groovy_scripts 的表有 script_name、script_source 和 last_updated 这几个列。它支持从 groovy_scripts 表装载脚本和检查修改情况。
现在,需要教会 Spring 识别 DatabaseScriptSource。为此,必须扩展 ScriptFactoryPostProcessor 并覆盖 convertToScriptSource 方法,该方法负责将一个脚本源代码定位符(例如 classpath:groovierspring/GroovyPdfGenerator.groovy)转换成一个 ScriptSource。清单 12 显示了 ScriptFactoryPostProcessor 中的默认实现:
清单 12. ScriptFactoryPostProcessor 的 convertToScriptSource 方法protected ScriptSource convertToScriptSource(
String beanName, String scriptSourceLocator, ResourceLoader resourceLoader) {
if (scriptSourceLocator.startsWith(INLINE_SCRIPT_PREFIX)) {
return new StaticScriptSource(
scriptSourceLocator.substring(INLINE_SCRIPT_PREFIX.length()), beanName);
}
else {
return new ResourceScriptSource(resourceLoader.getResource(scriptSourceLocator));
}
}
可以看到,默认的实现只处理内联和基于资源的脚本。还可以创建 ScriptFactoryPostProcessor 的一个新的子类,并覆盖 convertToScriptSource 方法,以便使用 DatabaseScriptSource 从数据库装载脚本,如清单 13 所示:
清单 13. CustomScriptFactoryPostProcessor 实现public class CustomScriptFactoryPostProcessor extends ScriptFactoryPostProcessor {
public static final String DATABASE_SCRIPT_PREFIX = "database:";
private DataSource dataSource;
@Required
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
@Override
protected ScriptSource convertToScriptSource(String beanName,
String scriptSourceLocator,
ResourceLoader resourceLoader) {
if (scriptSourceLocator.startsWith(INLINE_SCRIPT_PREFIX)) {
return new StaticScriptSource(
scriptSourceLocator.substring(INLINE_SCRIPT_PREFIX.length()), beanName);
}
else if (scriptSourceLocator.startsWith(DATABASE_SCRIPT_PREFIX)) {
return new DatabaseScriptSource(
scriptSourceLocator.substring(DATABASE_SCRIPT_PREFIX.length()),
dataSource);
}
else {
return new ResourceScriptSource(
resourceLoader.getResource(scriptSourceLocator));
}
}
}
更多精彩
赞助商链接