我有一个由 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 实现需要导出包,因此这只是一个设计缺陷。然后我只是找到了一种方法将服务分成两个不同的包(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)"