Я только начинаю работать с OSGI и декларативными службами (DS), использующими Equinox и Eclipse PDE.
У меня есть 2 Связки, A и B.
Пакет A предоставляет компонент, который используется Пакетом B. Оба пакета также снова предоставляют этот сервис реестру OSGI Service.
Пока все работает нормально, и Equinox соединяет компоненты вместе, что означает, что Bundle A и Bundle B создаются в Equinox (вызывая конструктор по умолчанию), а затем соединение происходит с использованием методов bind / unbind.
Теперь, когда Equinox создает экземпляры этих компонентов / сервисов, я хотел бы знать, как лучше всего получить этот экземпляр?
Итак, предположим, что существует третий класс класс, который НЕ создан OSGI:
Class WantsToUseComponentB{
public void doSomethingWithComponentB(){
// how do I get componentB??? Something like this maybe?
ComponentB component = (ComponentB)someComponentRegistry.getComponent(ComponentB.class.getName());
}
Я вижу следующие варианты прямо сейчас:
1. Используйте ServiceTracker в Активаторе , чтобы получить Службу ComponentBundleA.class.getName () (я уже пробовал это, и это работает, но мне кажется, что это накладные расходы) и сделать его доступным через статические фабричные методы
public class Activator{
private static ServiceTracker componentBServiceTracker;
public void start(BundleContext context){
componentBServiceTracker = new ServiceTracker(context, ComponentB.class.getName(),null);
}
public static ComponentB getComponentB(){
return (ComponentB)componentBServiceTracker.getService();
};
}
2. Создайте какой-нибудь реестр , в котором каждый компонент регистрируется сразу после вызова метода activ ().
public ComponentB{
public void bind(ComponentA componentA){
someRegistry.registerComponent(this);
}
или
public ComponentB{
public void activate(ComponentContext context){
someRegistry.registerComponent(this);
}
}
}
3. Использовать существующий реестр внутри osgi / equinox , который имеет эти экземпляры? Я имею в виду, что OSGI уже создает экземпляры и связывает их вместе, поэтому объекты уже где-то есть. Но где? Как я могу получить их?
Заключение
Откуда класс WantsToUseComponentB (который НЕ является Компонентом и НЕ создан OSGI) получает экземпляр ComponentB? Есть ли какие-либо модели или лучшие практики? Как я уже сказал, мне удалось использовать ServiceTracker в Activator, но я думал, что это было бы возможно без него.
То, что я ищу, на самом деле напоминает BeanContainer из Springframework, где я могу просто сказать что-то вроде Container.getBean (ComponentA.BEAN_NAME). Но я не хочу использовать Spring DS.
Надеюсь, это было достаточно ясно. В противном случае я также могу опубликовать некоторый исходный код, чтобы объяснить более подробно.
Спасибо
Christoph
<ч />
ОБНОВЛЕНИЕ:
Ответ на комментарий Нила:
Спасибо за разъяснение этого вопроса по сравнению с оригинальной версией, но я думаю, что вам все еще нужно указать, почему третий класс не может быть создан с помощью чего-то вроде DS.
Хм, не знаю. Может быть, есть способ, но мне нужно было бы реорганизовать всю мою платформу, чтобы она основывалась на DS, чтобы больше не было операторов "new MyThirdClass (arg1, arg2)".
Не знаю, как это сделать, но я читал кое-что о ComponentFactories в DS. Так что вместо того, чтобы делать
MyThirdClass object = new MyThirdClass(arg1, arg2);
Я мог бы сделать
ComponentFactory myThirdClassFactory = myThirdClassServiceTracker.getService(); // returns a
if (myThirdClassFactory != null){
MyThirdClass object = objectFactory.newInstance();
object.setArg1("arg1");
object.setArg2("arg2");
}
else{
// here I can assume that some service of ComponentA or B went away so MyThirdClass Componenent cannot be created as there are missing dependencies?
}
На момент написания статьи я не знаю точно, как использовать ComponentFactories, но предполагается, что это какой-то псевдокод:)
Спасибо
Christoph