2013-01-24 1 views
1

Если у меня есть OrderHandler интерфейса:Camel SimpleRegistry и DI

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

И есть несколько реализаций (DefaultOrderHandler, ComplexOrderHandler, SpecialOrderHandler и т.д.) из него, как указать, какой из них использовать в Верблюжьем SimpleRegistry? Например, если у меня есть следующий маршрут:

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

Как определить SimpleRegistry, и как настроить этот реестр «впрыснуть» в DefaultOrderHandler, когда я указываю процессор типа bean(OrderHandler.class)?

Я прошу, потому что было бы хорошо (для модульного тестирования), чтобы иметь возможность вставлять DummyOrderHandler во время тестирования и реальный имп во время производства. Заранее спасибо!

ответ

2

При использовании

bean(MyClass.class) 

Затем, как правило, тип класса (например, MyClass.class) должен быть класс (не абстрактно, а не интерфейс), как верблюд будет использовать, чтобы создать экземпляр экземпляра.

Однако, если метод, который вызывается, является статическим методом, то Camel не нужно создавать экземпляр объекта, и поэтому класс может быть абстрактным и т. Д. Вы можете указать имя метода как 2-й параметр для точки пинты, метод для вызова.

В вашем случае есть 3 различных варианта реализации интерфейса. Необходимо указать тип использовать

bean(MyImpl.class) 

Или обратитесь к бобе по имени для поиска в реестре, или предоставить экземпляр объекта Например:

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

Как его только Java код и если вы используете RouteBuilder, то вы можете JUSE иметь геттер/сеттер для OrderHandler, а затем установите требуемую реализацию на RouteBuilder

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

а потом в конфиге ure в MyRouteBuilder вы можете использовать

bean(handler)