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>


ScriptFactoryPostProcessor는 해당 스크립트에 맞는 ScriptFactory 적용을 위해서 필요하다. 연계 정보 정의가 없어도 자동으로 적용된다.

첫번째 생성자 인자는 루비 파일의 위치
두번째는 스크립트를 통해 생성한 것을 어떤 타입으로 다룰 것인지를 정의하는 인터페이스다.
인터페이스는 자바 인터페이스일 뿐 별도의 제약을 갖지 않는다. ^^

public interface Interpreter {

   public Object getNumber();

   public void print();

   public RubyArray getRubyArray();

}


루비 파일에는 선언부에 다음과 같이 자바 인터페이스를 따름을 지정한다.

require 'java'

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


자바 인터페이스 타입으로을 캐스팅 해야 한다.

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());
   }

}


숫자는 Long 타입으로 변환되어 전달된다.
대부분의 객체는 JRuby의 특정 클래스로 변환되어 전달된다.

Spring 덕분에 연결은 매우 쉽게 할 수 있다.
JRuby의 API가 강력해질수록 Ruby와 Java 객체 사이의 협력이 더 강력해질 것이다