24.2. 第一个例子

本章的大部分内容的关注点都在描述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 {

    @Property 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.0.xsd
http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-2.0.xsd">

    <!-- this is the bean definition for the Groovy-backed Messenger 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-backed Messenger -->
    <bean id="bookingService" class="x.y.DefaultBookingService">
        <property name="messenger" ref="messenger" />
    </bean>
</beans>

现在可以象以前一样使用bookingService bean (DefaultBookingService)的私有成员变量 messenger,因为被注入的Messenger实例确实一个真正的Messenger实例。这里也没有什么特别的地方,就是简单的Java和Groovy。

但愿你能够无需多加说明就看明白以上的XML片段,而不用太担心它是否恰当或者是否正确。请继续阅读更深层次的细节以了解以上配置的原因。