Java 我应该如何通过OSGi声明性服务声明has-a依赖关系?

Java 我应该如何通过OSGi声明性服务声明has-a依赖关系?,java,osgi,declarative-services,Java,Osgi,Declarative Services,我的OSGi应用程序使用白板模式注册特定状态更改的侦听器。我使用org.apache.felix.scr.annotations来声明我的服务和组件,而不是手工编写声明性XML。将我的组件注册为ChangeListener的最简单方法如下: @Component(name="...") @Service public class MyComponent implements ChangeListener { @Override public void changeOccurred(...

我的OSGi应用程序使用白板模式注册特定状态更改的侦听器。我使用org.apache.felix.scr.annotations来声明我的服务和组件,而不是手工编写声明性XML。将我的组件注册为ChangeListener的最简单方法如下:

@Component(name="...")
@Service
public class MyComponent implements ChangeListener {
    @Override public void changeOccurred(...) {
        // ...
    }
    // ...
}
这是一种is-a关系,它向任何请求它的人公开我的组件。相反,我想要一个has-a关系通过一个内部类注册我的ChangeListener。但是与上面的相比,下面的内容是非常丑陋的

@Component(name="...")
public class MyComponent {
    private ServiceRegistration registration;

    protected final void activate(final ComponentContext context) {
        registration = context.getBundleContext()
               .registerService(ChangeListener.class.getName(),
        new ChangeListener() {
            @Override public void changeOccurred(...) {
                // ...
            }
        }, null);
    }
    protected final void deactivate(final ComponentContext context) {
        registration.unregister();
    }
    // ...
}

有没有更好的方法来实现包含的监听器,该监听器不太冗长,但仍然可以实现内部类的信息隐藏?

声明性服务中不支持这种方法。但是我不知道第一个例子有什么问题。。。我觉得很干净。你能再解释一下你的动机吗?@Neil Bartlett-我的组件有多个其他公共方法和接口,我不想向任何要求ChangeListener的人公开这些方法和接口。我想这没什么大不了的,但我想在注入回调时遵循暴露最小曲面的模式。这是Swing中非常常见的模式。哦,我应该添加这个细节:“MyComponent”类也有几个@Reference注释。为了简洁起见,我省略了它们。关键是MyComponent本身不是服务,而是服务的用户。MyComponent的唯一一个类似服务的元素是listener。组件类应该在一个私有包中,因此另一个包除了
ChangeListener
接口上的那些方法之外,不会有任何其他方法的可见性(除非我想它们使用反射)。无论如何,我有点明白你的意思,但事实是DS不支持你想要的模式。谢谢尼尔,你太棒了。感谢您提供OSGi实践中的草稿书。这是我一年前开始学习OSGi时读的第一本书。