OSGi에는 두 가지 종류의 종속성이 있습니다. 첫 번째 종류는 기본적으로 번들을 안전하게 실행할 수있는 환경을 설정하는 것입니다. 여기에는 코드 종속성과 매니페스트에서 표현할 수있는 다른 종속성이 포함됩니다. 프레임 워크는 번들을 해결하기 전에 이러한 종속성이 충족되도록합니다. 이러한 종속성이 충족되지 않으면 단일 명령을 실행할 수 없습니다.
종속성의 두 번째 종류는보다 동적이며, 코드는 런타임에 변경 될 때 코드를 처리 할 수 있어야합니다. OSGi에서 이러한 종속성은 가장 잘 표현 된 서비스입니다. 선언적 서비스 (특히 주석이있는 서비스)에서는 다른 사람들에게 의존하는 것이 쉽지 않습니다. (제발, 서비스 트래커를 사용하지 마십시오. DS는 훨씬 멀리 떨어져 있습니다.)
다른 응답자가 말했듯이, 준비는 보는 사람의 눈에 있습니다. OSGi에서 서비스에 대한 의존성을 표현할 때 문제가 번들에서 벗어나 준비가되면 다음과 같이 할 수 있습니다. 서비스 X가 있습니까? 레지스트라 서비스 X가 이러한 규칙을 따르는 한 매우 강력하고 탄력있는 응용 프로그램 모델을 보유하게됩니다. 프레임 워크와 DS는 라이프 사이클 규칙을 엄격하게 따르므로 한 번에 하나의 모델에서 번들이 준비되었거나 붕괴되지 않는 이유는 여러 가지입니다.
짧은 예를 들어, 서비스 Y는 서비스 X에 따라 달라집니다
이
@Component
public class YImpl implements Y {
@Activate
void activate() { /* only called when X is registered */ }
@Reference
void setX(X x) {
this.x = x;
}
}
원하는 작업이 무엇? 해당 번들에서 서비스를 사용하면 서비스가 사용 가능하게되거나 사라질 때 알림을 받게됩니다. 왜 번들 자체를 감지해야합니까? – Thilo
기본적으로 내가하고 싶은 것은 번들이 컨테이너에 완전히로드되어 있고 어떤 req가오고 있는지를 탐지하는 것입니다 ... 예를 들어, 번들 A와 번들 B 같은 번들을 스크립트로 배포하고 있습니다. B는 A의 일부 서비스에 종속됩니다. 따라서 B를 배포하거나 실행하는 동안 B는 A가 완전히 사용 가능할 때까지 기다려야합니다.번들 A가 완전히로드 된 경우 우리에게 통지 할 수있는 방법이 있는지 알고 싶습니다. 따라서 스크립트는 번들 B를 계속 배포 할 수 있습니다. – stephanruhl