2013-01-24 6 views
1

가 나는 OrderHandler 인터페이스가있는 경우 :낙타 SimpleRegistry 및 DI

public interface OrderHandler { 
    public void handle(Order order); 
} 

를 여러 구현을 (DefaultOrderHandler, ComplexOrderHandler, SpecialOrderHandler 등) 그것을 어떻게 내가 낙타의 SimpleRegistry에 사용할 하나의 지정합니까 있나요? 나는 다음과 같은 경로가있는 경우 예를 들어, :

from("direct:pointA") 
    .bean(OrderHandler.class) 
    .to("direct:pointB"); 

은 어떻게 SimpleRegistry를 지정합니까, 어떻게 내가 유형 bean(OrderHandler.class)의 프로세서를 지정할 때 DefaultOrderHandler를 "주입"하는 그 레지스트리를 구성합니까?

테스트 중에는 DummyOrderHandler을 주입 할 수있는 것이 좋을 것이므로 (단위 테스트 용) 좋을 것이고, 생산 중 실제 impl을 주입하는 것이 좋을 것입니다. 미리 감사드립니다!

답변

2

낙타 인스턴스를 인스턴스화를 이용합니다으로 (인터페이스하지, 추상적하지 않음) 그리고 일반적으로 클래스 유형 (예 : MyClass.class)이 수업을해야

bean(MyClass.class) 

를 사용하여.

그러나 호출되는 메소드가 정적 메소드 인 경우 Camel은 객체를 인스턴스화 할 필요가 없기 때문에 클래스는 추상 등일 수 있습니다. 메소드 이름을 두 번째 매개 변수 인 pint point에 제공 할 수 있습니다. 호출 할 메소드.

귀하의 경우 인터페이스가 3 가지 구현되어 있습니다. 그 단지 자바 코드로

OrderHandler handler = new DummyOrderHandler; 
... 
bean(handler) 

을 : 당신은 레지스트리에서 조회, 또는 예를 들어 개체 인스턴스 을 제공하기 위해 이름

bean(MyImpl.class) 

를 사용하거나 빈을 참조 유형을 지정해야합니다 당신이 RouteBuilder를 사용하는 경우 다음 당신은 JUSE OrderHandler에 대한/세터 게터을 가질 수 있습니다, 다음 설정에서 다음 RouteBuilder

RouteBuilder myBuilder = new MyRouteBuilder(); 
myBuilder.setOrderHandler(new DummyOrderHandler()); 
... 

을 원하는 구현을 설정하고 사용할 수있는 MyRouteBuilder의 메서드 ure