Это дубликат другого вопроса, но копируется из другого:
Я столкнулся с проблемой с SCR Феликса, где я получаю сообщение:
ServiceFactory.getService () результатом был цикл
Причина, по которой это происходит, заключается в том, что в методе активации, называемом ServiceAImpl (который предоставляет ServiceA), служба регистрирует другую службу, называемую ServiceB.У меня есть другой компонент службы, назовите его ServiceCImpl, который зависит как от ServiceA, так и от ServiceB.Благодаря ServiceAImpl, регистрирующему ServiceB, ServiceCImpl удовлетворяется, и в рамках одного и того же вызова для активации ServiceAImpl вызываются методы привязки ServiceCImpl.Когда вызывается метод привязки для ServiceA, цикл обнаруживается, и компонент не может инициализироваться.
Может быть, есть способ позволить SCR ждать, чтобы связать ServiceCImpl, или, возможно, мне нужно зарегистрировать ServiceB по-другому?
Я думаю, что не имеет смысла, почему Felix SCR будет активировать ServiceCImpl в рамках метода активации ServiceAImpl.Я не думаю, что ServiceCImpl будет считаться удовлетворенным до тех пор, пока не завершится метод активации.Возможно, это проблема использования декларативных сервисов при одновременной регистрации сервисов непосредственно в платформе?
Не пробовали другие реализации SCR, такие как версия Equinox, но я мог бы попробовать это, чтобы увидеть, есть ли разница, номожет, кто-нибудь знает, является ли это OSGi или Felix?
Дополнительная информация: почему ServiceB не является компонентом службы ... ServiceA фактически имеет ссылку на службу 0..n для другой службы,Назовите это ServiceD.Каждый раз, когда компонент ServiceD предоставляет интерфейс, ServiceB регистрируется с использованием одного и того же объекта службы.Обычно один и тот же поставщик ServiceD может предоставлять ServiceB, но идея состоит в том, чтобы сделать общий интерфейс для разработчиков более упрощенным, чтобы им не приходилось предоставлять несколько интерфейсов служб (кроме того, ServiceB имеет некоторые свойства, которые устанавливаются автоматически, что должно бытьсделано вручную и, возможно, может быть сделано неправильно).