Eclipse4rcpアプリケーションで使用するOSGiバンドルを作成しました。依存関係を追加し、これらのサービスをアクティベーターに登録してクラスに注入すると、サービスの使用法は正常に機能します。
アクティベーターで
IUserService service = new TestUserService();
context.registerService(IUserService.class.getName(), service, null);
私のクラスで
@Inject
IUserService service;
service.getSth();
宣言型サービスを介してバンドルを使用する方が良い方法であると読みました。だから私の実装を変更しました。サービスを提供するために、バンドルにコンポーネント定義を作成しました。
<?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>
次に、アクティベーターからサービス登録を削除し、サービスコンシューマークラスを作成しました。
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;
}
}
}
および別のコンポーネント定義:
<?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>
これらの変更後、私のサービスの注入は機能しなくなります。問題は、注入されたサービス参照が毎回NULLになることです。
誰かが理由を知っていますか?何か忘れましたか?
どうもありがとう!