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

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

 2009-11-19 00:00:00 来源:WEB开发网   
核心提示: 清单 11 中的 DatabaseScriptSource 非常简单,不过您可以让它要求的数据库表结构更加通用,Groovy 使 Spring 更出色,第 2 部分: 在运行时改变应用程序的行为(10),它假设一个名为 groovy_scripts 的表有 script_name、script_

清单 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)); 
    } 
  } 
 
} 

上一页  5 6 7 8 9 10 

Tags:Groovy Spring 出色

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