这是另一个问题的副本,但从另一个问题复制:
我遇到了 Felix SCR 的问题,我收到以下消息:
ServiceFactory.getService() 导致了一个循环
之所以出现这种情况,是因为在激活方法中,将其称为 ServiceAImpl(提供 ServiceA),该服务注册了另一个服务,称为 ServiceB。
我有另一个服务组件,称为 ServiceCImpl,它同时依赖于 ServiceA 和 ServiceB。通过 ServiceAImpl 注册 ServiceB,ServiceCImpl 已经满足,并且在激活 ServiceAImpl 的同一个调用中,调用了 ServiceCImpl 绑定方法。调用ServiceA的绑定方法时,检测到循环,组件初始化失败。
也许有一种方法可以让 SCR 等待绑定 ServiceCImpl 或者我需要以不同的方式注册 ServiceB?
我想没有意义的是为什么Felix SCR会在ServiceAImpl的激活方法中激活ServiceCImpl。在激活方法退出之前,我不认为 ServiceCImpl 会被认为是满意的。也许这是在使用声明式服务的同时仍然直接向框架注册服务的问题?
还没有尝试过其他 SCR 实现,比如 Equinox 的版本,但我可能会尝试看看是否有区别,但也许有人知道这是 OSGi 的东西还是 Felix 的东西?
附加信息:至于为什么 ServiceB 不是服务组件...ServiceA 实际上对另一个服务具有 0..n 的服务引用,将其称为 ServiceD。每次组件提供 ServiceD 接口时,都会使用相同的服务对象注册 ServiceB。通常同一个 ServiceD 的提供者可以提供 ServiceB,但想法是让开发人员的整体界面更加简单,这样他们就不必提供多个服务接口(此外,ServiceB 有一些属性是自动设置的,这些属性必须是手动完成,可能做错了)。