2013-01-24 68 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)