?
このドキュメントでは、 php中國語ネットマニュアル リリース
在某些可能的場景下,使用腳本語言定義受Spring管理的bean是有好處的,當(dāng)然這樣的場景是各式各樣的。 這一節(jié)描述了兩個(gè)能使用Spring動(dòng)態(tài)語言支持特性的用例。
請注意Spring的發(fā)布包中包括了一個(gè)動(dòng)態(tài)語言支持的示例項(xiàng)目(示例項(xiàng)目只是一個(gè)小項(xiàng)目,僅用于演示Spring框架的某些特定的特征)。
有一組類可以使用dynamic-language-backed bean并從中獲益,那就是Spring MVC控制器。在純Spring MVC應(yīng)用中,貫穿整個(gè)web應(yīng)用的導(dǎo)航流程,相當(dāng)大的部分都封裝在Spring MVC控制器的代碼中。因?yàn)閣eb應(yīng)用的導(dǎo)航流程和其他表示層邏輯需要能夠積極響應(yīng)業(yè)務(wù)需求的變化和問題,通過編輯一個(gè)或多個(gè)動(dòng)態(tài)語言源文件也許可以更容易響應(yīng)這樣那樣的變化,而且通過這種方式,一個(gè)處于運(yùn)行狀態(tài)的應(yīng)用可以立即反映出所做的改動(dòng)。
像Spring這樣由項(xiàng)目支持的輕量級(jí)架構(gòu)模型中,你的目標(biāo)是擁有一個(gè)真正瘦小 的表示層,而應(yīng)用的所有業(yè)務(wù)邏輯都在包裝在領(lǐng)域?qū)雍头?wù)層的類中,將Spring MVC控制器作為dynamic-language-backed bean來進(jìn)行開發(fā),可以簡單的編輯保存文本文件就可以修改表示層邏輯,這些動(dòng)態(tài)語言源文件的任何變化都可以(取決于配置)自動(dòng)的反射為bean(底層為動(dòng)態(tài)語言源文件)的變化。
請注意為了自動(dòng)“獲取”dynamic-language-backed bean的各種變化,你必須啟用'refreshable beans' 功能。 關(guān)于該特征的詳細(xì)情況請參考第?24.3.1.2?節(jié) “Refreshable bean”一節(jié)。
下面的示例是使用Groovy動(dòng)態(tài)語言實(shí)現(xiàn)的org.springframework.web.servlet.mvc.Controller
。這個(gè)例子選自Spring發(fā)布包中提供的動(dòng)態(tài)語言支持示例項(xiàng)目。關(guān)于該項(xiàng)目的詳情請參考Spring發(fā)布包中的'samples/showcases/dynamvc/'
目錄。
// from the file '/WEB-INF/groovy/FortuneController.groovy' package org.springframework.showcase.fortune.web import org.springframework.showcase.fortune.service.FortuneService import org.springframework.showcase.fortune.domain.Fortune import org.springframework.web.servlet.ModelAndView import org.springframework.web.servlet.mvc.Controller import javax.servlet.http.HttpServletRequest import javax.servlet.http.HttpServletResponse class FortuneController implements Controller { @Property FortuneService fortuneService ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse httpServletResponse) { return new ModelAndView("tell", "fortune", this.fortuneService.tellFortune()) } }
<lang:groovy id="fortune" refresh-check-delay="3000" script-source="/WEB-INF/groovy/FortuneController.groovy"> <lang:property name="fortuneService" ref="fortuneService"/> </lang:groovy>
在使用Spring進(jìn)行應(yīng)用程序開發(fā)時(shí),校驗(yàn)可能會(huì)是另一個(gè)可以從dynamic-language-backed bean提供的靈活性中獲益的方面。 相對(duì)于Java語言,使用松散類型的動(dòng)態(tài)語言(可能還支持內(nèi)置的正則表達(dá)式)也許可以更容易地表示復(fù)雜的校驗(yàn)邏輯。
使用dynamic-language-backed bean作為校驗(yàn)器,可以很容易的改變校驗(yàn)邏輯,只要編輯簡單的文本文件即可; 任何此類修改會(huì)(根據(jù)配置)自動(dòng)反應(yīng)到正在運(yùn)行的應(yīng)用程序中,而無需重啟應(yīng)用程序。
請注意為了自動(dòng)“獲取”dynamic-language-backed bean的各種變化,你必須啟用 'refreshable beans' 功能。關(guān)于該特征的詳細(xì)情況請參考第?24.3.1.2?節(jié) “Refreshable bean”一節(jié)。
下面的示例是使用Groovy動(dòng)態(tài)語言實(shí)現(xiàn)的org.springframework.validation.Validator
。(關(guān)于Validator
接口的討論請參考第?5.2?節(jié) “使用Spring的Validator
接口進(jìn)行校驗(yàn)” 一節(jié))
import org.springframework.validation.Validator import org.springframework.validation.Errors import org.springframework.beans.TestBean class TestBeanValidator implements Validator { boolean supports(Class clazz) { return TestBean.class.isAssignableFrom(clazz) } void validate(Object bean, Errors errors) { if(bean.name?.trim()?.size() > 0) { return } errors.reject("whitespace", "Cannot be composed wholly of whitespace.") } }