文档章节

《Spring Recipes》第四章笔记1:Scripting in Spring

LiJIaming
 LiJIaming
发布于 2012/05/24 23:58
字数 570
阅读 266
收藏 0

《Spring Recipes》第四章笔记1:Scripting in Spring


问题


想在Spring中使用JRuby、Groovy、BeanShell等脚本语言。

解决方案

Spring运行用户使用Spring支持的脚本语言实现bean,和配置使用Java实现的bean没有区别。

例:
1、假设需要实现一个计算利润的应用,定义了一个接口InterestCalculator:
public interface InterestCalculator {
    public void setRate(double rate);
    public double calculate(double amount, double year);
}

2、由于计算利润的策略太多,而且变化太快,所以使用Java实现的话,用户必须不断修改实现,然后recompile、repackage、redeploy。此时,如果使用脚本进行实现,就可以动态修改,不需要recompile、repackage、redeploy。在Spring中使用脚本,需要引入lang schema:
<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-3.0.xsd
http://www.springframework.org/schema/lang
http://www.springframework.org/schema/lang/spring-lang-3.0.xsd">
...
</beans>

Spring2.5开始,支持三种脚本:JRuby、Groovy、BeanShell。

假设Interest = Amount x Rate x Year。

3、使用JRuby。
    (1)创建SimpleInterestCalculator.rb,实现InterestCalculator接口。
class SimpleInterestCalculator
    def setRate(rate)
        @rate = rate
    end
    def calculate(amount, year)
        amount * year * @rate
    end
end

SimpleInterestCalculator.new

    (2)在配置文件中配置SimpleInterestCalculator.rb。因为使用了JRuby脚本,所以需要使用<lang:jruby>元素,
script-source属性指定了JRuby脚本的位置,script-interfaces指定了脚本实现的接口。
使用<lang:property>元素对脚本中的属性进行注入。
<lang:jruby id="interestCalculator"
script-source="classpath:com/apress/springrecipes/interest/SimpleInterestCalculator.rb"
script-interfaces="com.apress.springrecipes.interest.InterestCalculator">
<lang:property name="rate" value="0.05" />
</lang:jruby>

    (3)和使用普通bean一样使用JRuby实现的bean。
ApplicationContext context =new ClassPathXmlApplicationContext("beans.xml");
InterestCalculator calculator =(InterestCalculator) context.getBean("interestCalculator");
System.out.println(calculator.calculate(100000, 1));

4、使用Groovy。
    (1)创建SimpleInterestCalculator.groovy,实现InterestCalculator接口。
import com.apress.springrecipes.interest.InterestCalculator;
class SimpleInterestCalculator implements InterestCalculator {
    double rate
    double calculate(double amount, double year) {
        return amount * year * rate
    }
}

    (2)在配置文件中使用<lang:groovy>元素进行配置。因为 SimpleInterestCalculator.groovy中指定了实现的接口,所以配置文件中无需实现的接口。
<lang:groovy id="interestCalculator"
script-source="classpath:com/apress/springrecipes/interest/SimpleInterestCalculator.groovy">
    <lang:property name="rate" value="0.05" />
</lang:groovy>

5、使用BeanShell。
    (1)创建SimpleInterestCalculator.bsh,实现InterestCalculator接口。
double rate;
void setRate(double aRate) {
    rate = aRate;
}
double calculate(double amount, double year) {
    return amount * year * rate;
}

    (2)在配置文件中使用<lang:bsh>元素进行配置。
<lang:bsh id="interestCalculator"
script-source="classpath:com/apress/springrecipes/interest/SimpleInterestCalculator.bsh"
script-interfaces="com.apress.springrecipes.interest.InterestCalculator">
    <lang:property name="rate" value="0.05" />
</lang:bsh>





© 著作权归作者所有

LiJIaming
粉丝 22
博文 58
码字总数 25865
作品 0
深圳
程序员
私信 提问
《Spring Recipes》第四章笔记3:Refreshing Beans from Sc...

《Spring Recipes》第四章笔记3:Refreshing Beans from Scripts 问题 脚本经常刷新,需要Spring容器自动探测变化和刷新。 解决方案 使用<lang>元素的refresh-check-delay属性,Spring容器可...

LiJIaming
2012/05/25
77
0
《Spring Recipes》第四章笔记2:Injecting Spring Beans i...

《Spring Recipes》第四章笔记2:Injecting Spring Beans into Scripts 问题 需要将Spring中的bean注入到脚本中。 解决方案 使用Setter注入的方式将bean注入到脚本中。 例:假设接口Interes...

LiJIaming
2012/05/25
101
0
《Spring Recipes》第四章笔记4:Defining Script Sources ...

《Spring Recipes》第四章笔记4:Defining Script Sources Inline 问题 脚本内容很少,不需要单独写入脚本文件中。 解决方案 使用lang:inline-script元素定义脚本。 使用JRuby <lang:jruby i...

LiJIaming
2012/05/25
55
0
《Spring Recipes》第二章笔记:Declaring Beans from Obje...

《Spring Recipes》第二章笔记:Declaring Beans from Object Properties 问题 在配置文件中将一个对象的属性声明为bean。 解决方案 使用Spring自带的PropertyPathFactoryBean工厂bean或者使...

LiJIaming
2012/05/17
59
0
《Spring Recipes》第二章笔记:Setting Bean Scopes

《Spring Recipes》第二章笔记:Setting Bean Scopes 问题 Spring容器默认创建的bean都是单例。 解决方案 Spring容器的<bean>元素的scope属性指定了bean的scope。 Table 4.3. Bean scopes 例...

LiJIaming
2012/05/17
108
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
4
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
8
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
4
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
6
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
6
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部