1.创建接口
package test.org.springframework.scripting;
/**
* @author Rob Harrop
*/
public interface Messenger {String getMessage();
}
2.创建ruby实现[Messenger.rb]
require 'java'
include_class 'test.org.springframework.scripting.Messenger'
class RubyMessenger < Messenger
def setMessage(message)
@@message = message
enddef getMessage
@@message+'ycl'
end
end
3.定义切面
package test.org.springframework.scripting;
import org.aspectj.lang.ProceedingJoinPoint;
public final class MessengerScrambler {public String scramble(ProceedingJoinPoint pjp) throws Throwable {
String message = (String) pjp.proceed();
return new StringBuffer(message).reverse().toString();
}}
4.编写jruby-aop.xml
<?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"
xmlns:aop="http://www.springframework.org/schema/aop"
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
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"><lang:jruby id="messenger"
script-interfaces="test.org.springframework.scripting.Messenger"
script-source="classpath:test/org/springframework/scripting/jruby/Messenger.rb">
<lang:property name="message" value="Hello World!"/>
</lang:jruby><aop:config>
<aop:pointcut id="messengerOps"
expression="execution(String test.org.springframework.scripting.Messenger.*())"/>
<aop:aspect id="scramblerAspect" ref="scrambler">
<aop:around pointcut-ref="messengerOps"
method="scramble"/>
</aop:aspect>
</aop:config><bean id="scrambler" class="test.org.springframework.scripting.MessengerScrambler"/>
</beans>
5.编写测试类
public class JRubyScriptFactoryTests extends TestCase {
public static void main(String args[]) throws Exception{
JRubyScriptFactoryTests ruby=new JRubyScriptFactoryTests();
ruby.testAOP();
}
public void testAOP() throws Exception {
//采用Aop来实现ruby.ApplicationContext ctx = new ClassPathXmlApplicationContext("jruby-aop.xml", getClass());
Messenger messenger = (Messenger) ctx.getBean("messenger");
System.out.println(new StringBuffer("Hello World!").reverse().toString()+"==="+ messenger.getMessage());
}
}
可见Spring已经集成了Jruby的调用,只需要定义接口,实现可以用ruby进行定义。