2016-03-11 6 views
3

Допустит, у меня есть расслоение, и он имеет HelloWorld интерфейса и функцию HelloWorld()как я могу использовать OSGi службу в другом пакете

Теперь, в другом расслоении B, я реализую следующие

@Service(HelloWorld.class) 
@Component(immediate = true) 
public class Test1Impl implements HelloWorld 
{ 
    public String helloWorld() 
    { 
    return "I'm from Bundle B"; 
    } 
} 

Я другой пучок C, я делаю

@Service(HelloWorld.class) 
@Component(immediate = true) 
public class Test2Impl implements HelloWorld 
{ 
    public String helloWorld() 
    { 
    return "I'm from Bundle C"; 
    } 
} 

Теперь, если мне нужно, чтобы получить реализацию Bundle C только тогда, что я должен делать? Например, в общем, я делаю, как показано ниже, но в этом случае он не работает.

Helloworld obj = sling.getService(HelloWorld.class); 
obj.helloWorld(); 
+0

Что означает «это не работает»? Это не дает никакой информации. Укажите, что вы ожидали, и что на самом деле произошло. –

+0

@NeilBartlett, я имею в виду, что я не получаю желаемого результата «Я из Bundle C», вместо этого получаю «Я из Bundle B», я предполагаю, что это происходит, потому что Bundle B был разрешен первым. –

+0

Нет, это не имеет никакого отношения к тому, кто решает сначала. Вы можете получить любую из реализаций, потому что они являются одинаково действительными совпадениями для запрашиваемого интерфейса службы. –

ответ

5

Вы можете использовать свойства и фильтровать, чтобы выбрать, какую реализацию вы хотите получить.

Например, вы можете поместить имущество на реализацию в расслоении C:

@Service(HelloWorld.class) 
@Component(immediate = true) 
@Property(name = "bundle", value = "bundle-c") 
public class Test2Impl implements HelloWorld { .. } 

затем использовать фильтр, чтобы получить эту реализацию. вы получите набор сервисов, соответствующих фильтру.

HelloWorld[] services = sling.getServices(HelloWorld.class, "(bundle=bundle-c)") 

По умолчанию DS помещает свойство с именем компонента. Это свойство «component.id», а имя компонента по умолчанию - полное имя класса реализации. Таким образом, вы также можете использовать:

HelloWorld[] services = sling.getServices(HelloWorld.class, "(component.id=package.Test2Impl)") 
+0

если я хочу получить доступ через @Reference, то reference.target является правильным способом? –

+0

Да, «цель» - это фильтр osgi, то же, что и в 'getServices' –