本章的大部分内容的关注点都在描述Spring对动态语言的支持的细节上。在深入到这些细节之前,首先让我们看一个使用动态语言定义的bean的快速上手的例子。第一个bean使用的动态语言是Groovy(这个例子来自Spring的测试套件,如果你打算看看对其他语言的支持的相同的例子,请阅读相应的源码)。
下面是Groovy bean要实现的Messenger
接口。注意该接口是使用纯Java定义的。依赖的对象是通过Messenger
接口的引用注入的,并不知道其实现是Groovy脚本。
package org.springframework.scripting; public interface Messenger { String getMessage(); }
下面是依赖于Messenger
接口的类的定义。
package org.springframework.scripting; public class DefaultBookingService implements BookingService { private Messenger messenger; public void setMessenger(Messenger messenger) { this.messenger = messenger; } public void processBooking() { // use the injected Messenger object... } }
下面是使用Groovy实现的Messenger
接口。
// from the file 'Messenger.groovy' package org.springframework.scripting.groovy; // import the Messenger interface (written in Java) that is to be implemented import org.springframework.scripting.Messenger // define the implementation in Groovy class GroovyMessenger implements Messenger { String message }
最后,这里的bean定义将Groovy定义的Messenger
实现注入到DefaultBookingService
类的实例中。
注意
要使用用户定制的动态语言标签来定义 dynamic-language-backed bean,需要在Spring XML配置文件的头部添加相应的XML Schema。同样需要Spring的ApplicationContext
实现作为IoC容器。Spring支持在简单的BeanFactory
实现下使用dynamic-language-backed bean,但是你需要管理Spring内部的种种细节。
关于XML Schema的配置,详情请看附录 A, XML Schema-based configuration。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:lang="http://www.springframework.org/schema/lang" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.5.xsd"> <!-- this is the bean definition for the Groovy-backedMessenger
implementation --> <lang:groovy id="messenger" script-source="classpath:Messenger.groovy"> <lang:property name="message" value="I Can Do The Frug" /> </lang:groovy> <!-- an otherwise normal bean that will be injected by the Groovy-backedMessenger
--> <bean id="bookingService" class="x.y.DefaultBookingService"> <property name="messenger" ref="messenger" /> </bean> </beans>
现在可以象以前一样使用bookingService
bean (DefaultBookingService
)的私有成员变量 messenger
,因为被注入的Messenger
实例确实是一个真正的Messenger
实例。这里也没有什么特别的地方,就是简单的Java和Groovy。
但愿你能够无需多加说明就看明白以上的XML片段,而不用太担心它是否恰当或者是否正确。请继续阅读更深层次的细节以了解以上配置的原因。