ファクトリ メソッドを使用して実装を返す必要があるため、Apache Felix Dependency Manager によってインスタンス化されたサービスがあります。
manager.add(
manager.createComponent()
.setInterface(aServiceName, new Properties())
.setFactory(factory, "create"));
このサービスを同じバンドル内のサービスに挿入したいので、aService と bService の両方を同じバンドルに含める必要があります。
@Component
public class BService {
@Reference
private AService aService;
[...]
}
これは完全に正常に機能しています。問題は、プライベート サービスのように aService をバンドルの外に表示したくないということです。私が削除した場合:
.setInterface(aServiceName, new Properties())
とにかく作成されたように見えるコンポーネントは作成されておらず、サービスとして登録されていないため、他のバンドルでは使用できませんが、DS アノテーションを使用してコンポーネントを挿入することはできません。サービスを元のバンドル内でのみ表示することは本当に不可能ですか? または、DS アノテーションを使用してコンポーネントを挿入する方法はありますか?
コンポーネントを注入するために Apache Felix Dependency Manager を使用してみました。
import org.apache.felix.dm.annotation.api.Component;
import org.apache.felix.dm.annotation.api.ServiceDependency;
@Component
public class BService {
@ServiceDependency
private AService aService;
[...]
}
しかし、コンポーネントが注入されていないことがわかりました:
[32] org.apache.felix.dependencymanager.runtime
[0] org.apache.felix.dm.runtime.DependencyManagerRuntime registered
active (DependencyManager-Component=*) bundle optional available
org.osgi.service.packageadmin.PackageAdmin service required available
org.osgi.service.log.LogService service optional available
[131] [...]
[7] [...].BService unregistered
org.osgi.service.log.LoggerFactory service required available
[...].AService service required unavailable
これは、単純なコンポーネントを @ServiceDependency で注入できないことを意味しますか?それらはサービスであり、OSGI レジストリにある必要があるためですか? では、アノテーションを使用して単純なコンポーネントを挿入するにはどうすればよいでしょうか? あるはずですよね?
アップデート
aService の実装ではパッケージをエクスポートする必要があることに気付きました。したがって、これは単なる設計上の欠陥でした。次に、サービスを 2 つの異なるバンドル (OSGI の方法) に分離する方法を見つけ、問題を解決しました。
それを行う前に、エクスポートされたバンドルからパッケージを削除しようとしましたが、それでも機能しませんでした.サービスは引き続き利用可能でした.
Export-Package: [...].services;version="0.0.1"
Provide-Capability: osgi.service;uses:="[...].services";o
bjectClass="[...].services.BService",osgi.service;uses:=
"[...].services.internal";objectClass="[...].services.internal.AService"
Require-Capability: osgi.extender;filter:="(&(osgi.extender=osgi.compo
nent)(version>=1.4.0)(!(version>=2.0.0)))",osgi.service;effective:=ac
tive;filter:="(objectClass=[...].services.internal.AServ
ice)"