OSGI 中声明式服务的动态目标

Dynamic target for declarative service in OSGI

给定一个使用服务的消费者,这个消费者如何 select 一个特定的提供者动态地使用声明式服务?

例子

Service.java

public interface Service {
    public void do();
}

Provider1.java

public class Provider1 implements Service {    
    @Override
    public void do(){
        //a way 
    }   
}

Provider2.java

public class Provider2 implements Service {    
    @Override
    public void do(){
        //another way 
    }   
}

Consumer.java

public class Consumer {
    private Service myService;

    protected void bindService(Service s){ // Actually it's Provider1
        myService = s;
    }

    protected void unbindService(Service s){
        myService = null;
    }

    public void useThisKindOfService(String s){
        // Do something crazy
    }
}

所以,我想要的不是 "Do something crazy",而是找到一种重新配置消费者的方法,以便发布 Provider1 并请求 Provider2。

可能吗?

与 "Duplicate Question"

相关的更新

OSGI/Felix Declarative services: How to filter the services to be bound

在我的上下文中,我不能使用声明性目标,因为必须在构建时知道目标的值,在我的情况下,目标可以由用户在运行时定义。

声明式服务的组件可以通过 ConfigurationAdmin 配置。通过这样做,可以在运行时更改组件的配置。

您还可以在运行时通过 ConfigurationAdmin 更改 myService.target 的配置。如果这样做,另一个引用将绑定到您的组件。

如果您的组件的引用策略是动态的,则无需重新激活您的组件即可绑定新的引用。

有关详细信息,请参阅 OSGi Compendium 规范的声明性服务一章。