Napisałem pakiet OSGi, aby użyć go w mojej aplikacji eclipse 4 rcp. Korzystanie z usługi działa dobrze, jeśli dodam zależności, zarejestruję te usługi w moim aktywatorze i wstrzyknę je w moją klasę.Eclipse RCP 4 użyj pakietu za pośrednictwem usługi deklaratywnej
W aktywatora
IUserService service = new TestUserService();
context.registerService(IUserService.class.getName(), service, null);
W mojej klasie
@Inject
IUserService service;
service.getSth();
Czytałem, że przy użyciu wiązek za pośrednictwem usług deklaratywnych powinien być lepszy sposób. Tak zmieniłem moją implementację. stworzyłem składnik definicji w moim zestawie, aby zapewnić moją usługę:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="usermanagement.test">
<implementation class="usermanagement.test.TestUserService"/>
<service>
<provide interface="usermanagement.IUserService"/>
</service>
</scr:component>
Potem usunięto rejestrację usługi z mojego aktywatora i stworzył klasę konsumentów usługę:
public class UserServiceConsumer {
private IUserService service;
public synchronized void setQuote(IUserService service) {
this.service = service;
}
public synchronized void unsetQuote(IUserService service) {
if (this.service == service) {
this.service = null;
}
}
}
i inną definicję składnika:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="UserServiceConsumer">
<implementation class="services.UserServiceConsumer"/>
<reference bind="setService" cardinality="1..1" interface="usermanagement.IUserService" name="IUserService" policy="static" unbind="unsetService"/>
</scr:component>
Po tych modyfikacjach wstrzyknięcie mojej porcji już nie działa. Problem polega na tym, że wstrzyknięte odwołanie do usługi ma wartość NULL za każdym razem.
Czy ktoś wie, dlaczego? Czy coś zapomniałem?
Wielkie dzięki!
Jak można wywnioskować, że OP chce skorzystać z usługi w klasie UI? – tkotisis
Używam DI, aby utworzyć instancję mojej klasy przy użyciu adnotacji @Creatable na konstruktorze klasy. – roschulze
@tkotsis, jeśli używasz Eclipse RCP, a następnie zwykle do zbudowania GUI –