http://blog.naver.com/galad/140039213857
<bean class="org.springframework.scripting.support.ScriptFactoryPostProcessor"/>
<bean id="interpreter" class="org.springframework.scripting.jruby.JRubyScriptFactory">
<constructor-arg value="classpath:org/springframework/scripting/jruby/ext/Interpreter.rb"/>
<constructor-arg value="org.springframework.scripting.jruby.ext.Interpreter"/>
</bean>
<bean id="interpreter" class="org.springframework.scripting.jruby.JRubyScriptFactory">
<constructor-arg value="classpath:org/springframework/scripting/jruby/ext/Interpreter.rb"/>
<constructor-arg value="org.springframework.scripting.jruby.ext.Interpreter"/>
</bean>
ScriptFactoryPostProcessor는 해당 스크립트에 맞는 ScriptFactory
적용을 위해서 필요하다. 연계 정보 정의가 없어도 자동으로 적용된다.
첫번째 생성자 인자는 루비 파일의 위치
두번째는 스크립트를 통해 생성한 것을 어떤 타입으로 다룰 것인지를 정의하는 인터페이스다.
인터페이스는 자바 인터페이스일 뿐 별도의 제약을 갖지 않는다. ^^
public interface Interpreter {
public Object getNumber();
public void print();
public RubyArray getRubyArray();
}
public Object getNumber();
public void print();
public RubyArray getRubyArray();
}
루비 파일에는 선언부에 다음과 같이 자바 인터페이스를 따름을 지정한다.
require 'java'
include_class 'net.agilejava.script.Interpreter'
class RubyInterpreter < Interpreter
include_class 'net.agilejava.script.Interpreter'
class RubyInterpreter < Interpreter
그리고 이것 저것 타이핑을 즐겨본다. ^^
class RubyInterpreter < Interpreter
def getNumber
0
end
def print
puts "gin joint".length
puts "Rick".index("c")
puts -1942.abs
puts sayGoodnight "younghoe"
puts sayGoodnight("younghoe")
puts [ 1, 'cat', 3.14 ]
end
def sayGoodnight(name)
"Goodnight, #{name}"
end
def getRubyArray
[ 1, 'cat', 3.14, 'dddd', '' , 1 ]
end
end
def getNumber
0
end
def print
puts "gin joint".length
puts "Rick".index("c")
puts -1942.abs
puts sayGoodnight "younghoe"
puts sayGoodnight("younghoe")
puts [ 1, 'cat', 3.14 ]
end
def sayGoodnight(name)
"Goodnight, #{name}"
end
def getRubyArray
[ 1, 'cat', 3.14, 'dddd', '' , 1 ]
end
end
자바 인터페이스 타입으로을 캐스팅 해야 한다.
public class JRubyScriptFactoryTests extends TestCase {
private Interpreter interpreter;
@Override
protected void setUp() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"net/agilejava/script/jrubyContext.xml");
interpreter = (Interpreter) ctx.getBean("interpreter");
}
public void testNumToLong() {
Object result = interpreter.getNumber();
assertEquals("A result number should be a Long value", Long.class,
result.getClass());
}
public void testPrint() {
interpreter.print();
}
public void testRubyArray() {
RubyArray rubyArray = interpreter.getRubyArray();
assertEquals("The array size should be 6", 6, rubyArray.size());
}
}
private Interpreter interpreter;
@Override
protected void setUp() throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"net/agilejava/script/jrubyContext.xml");
interpreter = (Interpreter) ctx.getBean("interpreter");
}
public void testNumToLong() {
Object result = interpreter.getNumber();
assertEquals("A result number should be a Long value", Long.class,
result.getClass());
}
public void testPrint() {
interpreter.print();
}
public void testRubyArray() {
RubyArray rubyArray = interpreter.getRubyArray();
assertEquals("The array size should be 6", 6, rubyArray.size());
}
}
숫자는 Long 타입으로 변환되어 전달된다.
대부분의 객체는 JRuby의 특정 클래스로 변환되어 전달된다.
Spring 덕분에 연결은 매우 쉽게 할 수 있다.
JRuby의 API가 강력해질수록 Ruby와 Java 객체 사이의 협력이 더 강력해질 것이다
'프로그래밍 > Framework' 카테고리의 다른 글
[iBatis] There is no DAO implementation found for... (0) | 2009.04.06 |
---|---|
[Struts2] struts.properties (0) | 2009.03.13 |
[펌] Introduction to Hibernate 2 (0) | 2007.11.28 |
[펌] Hibernate 3.02 Reference Document 한글 버전 (0) | 2007.11.28 |
[펌] ibatis (0) | 2007.11.28 |