2013-01-24 67 views
1

如果我有一個OrderHandler接口:駱駝SimpleRegistry和DI

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

而且有幾種實現方式(DefaultOrderHandlerComplexOrderHandlerSpecialOrderHandler等)的話,我怎麼指定駱駝的SimpleRegistry使用哪一個?舉例來說,如果我有以下途徑:

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

如何指定SimpleRegistry,以及我如何配置註冊表時,我指定bean(OrderHandler.class)類型的處理器「注入」一DefaultOrderHandler

我問,因爲在測試過程中注入DummyOrderHandler會很好(對於單元測試),並且在生產過程中注入一個真實的impl。提前致謝!

回答

2

當使用

bean(MyClass.class) 

然後通常是類的類型(例如MyClass.class)必須是類(未抽象,不接口等)。駱駝將使用該實例化的實例。

但是,如果被調用的方法是一個靜態方法,那麼Camel不需要實例化一個對象,因此該類可以是抽象的等等。您可以將方法名稱作爲第二個參數提供給pint點方法來調用。

在你的情況下,有3個不同的接口實現。你需要指定類型由名稱使用

bean(MyImpl.class) 

或者指豆在註冊表中查找,或者提供一個對象實例 例如:

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

正如它只是Java代碼,如果你正在使用RouteBuilder那麼你可以JUSE擁有的getter/setter方法OrderHandler,然後設置RouteBuilder

所需實施方案
RouteBuilder myBuilder = new MyRouteBuilder(); 
myBuilder.setOrderHandler(new DummyOrderHandler()); 
... 

然後在配置在MyRouteBuilder中你可以使用

bean(handler)