我正在使用 OSGi 部署捆绑 Apache Felix 容器。我有一个 maven 项目(~100bundles)并使用 maven-scr-plugin 生成清单文件和 DS 描述符,我有一个类似于下面描述的代码的问题。在没有将所有提供程序都注入 ClassA 之前,我需要不激活 ClassB(如果有一个不接触 ClassA 的解决方案,那就太好了,但这是可能的)。在 ClassB 调用它的激活方法后,Provider2 被添加到 ClassA,这就是为什么我在输出中获得“默认”值的原因。如果我稍后触发打印方法,它会按预期工作。
如果有人使用过 OSGi,请提供建议。先感谢您。
public interface I1{
String getMessage(String key);
}
public interface IProvider{
String getMessage(String key);
}
bundle1:
@Component
public class ClassA implements I1{
List<IProvider> providers = new ArrayList<>();
@Reference(cardinality = ReferenceCardinality.AT_LEAST_ONE, policy = ReferencePolicy.DYNAMIC)
public synchronized void addProvider(IProvider provider) {
providers.add(provider);
}
public String getMessage(String key){
String message = null;
for(IProvider provider: providers){
message = provider.getMessage(key);
if(message!=null){
return message;
}
}
return "default"
}
}
捆绑2:
@Component
public class Provider1 implements IProvider{
public getMessage(String key){
if(key.equals("key1")){
return "value1";
}
return null;
}
}
捆绑3:
@Component
public class Provider2 implements IProvider{
public getMessage(String key){
if(key.equals("key2")){
return "value2";
}
return null;
}
}
捆绑4:
public interface I2{
print();
}
@Component
public class ClassB implement I2{
private I1 impl;
@Reference(cardinality = ReferenceCardinality.MANDATORY, policy = ReferencePolicy.STATIC)
public void setService(I1 aService) {
impl = service;
}
public void print(){
System.out.println(impl.getMessage("key1"));
System.out.println(impl.getMessage("key2"));
}
@Activate
public void activate(){
print();
}
}
输出是:
value1
default