2011-07-27 3 views
8

필자는이 시나리오를 사용하여 동일한 인터페이스를 제공하는 선언적 서비스가 3 가지 (예 : 판독기 인터페이스와 readerimpl1-database-readimpl2-flat-file-readimpl3- 메모리가 있음)했습니다. 나는 데이터베이스 구현에만 바인딩하는 소비자를 원한다. 구성 요소 정의에서 이름을 지정하므로 이름이 레지스트리에 있음을 확신 할 수 있으므로 활성화 메서드를 추가하면 이름을 사용하여 구성 요소 컨텍스트에서 조회 할 수 있습니다.Osgi 선언적 서비스 조건부 바인딩

서비스 이름을 매개 변수로 사용하지만 bind/unbind를 통해 문제를 해결하려고합니다. 나는 꽤 그 구성 요소를 참조하는 요소의 "대상"매개 변수는이 작업을 수행하는 데 사용할 수 있지만 그것을 사용하는 방법을 찾지 못했습니다.

다른 사람이이 작업을 수행 한 사람이 있습니까?

+0

이는 당신의 서비스를 값 file 또는 database으로 backend라는 이름의 속성이 경우에 따라서, 다음과 같은 목표와 결합 할 수있다 정말 흥미로운 질문입니다. 그것은 당신이 데이터베이스 impl을 선호하지만 다른 것을 받아 들일 것인지에 대한 관련된 질문을 생각하게 만듭니다. 이 시나리오에서는 @Reference (cardinality = ReferenceCardinality.OPTIONAL_MULTIPLE, policy = ReferencePolicy.DYNAMIC)를 통해 구현 한 다음 추가/제거 메소드에서 목록을 살펴볼 수 있습니다. –

답변

14

목표는 단순히은 OSGi filter입니다 @Reference (맵 이름 = "foo는")를 사용하는 것과 비슷하다. 이 필터를 사용하여 모든 서비스 속성별로 필터링 할 수 있습니다. 같은

<scr:reference ... target="(backend=database)"/> 

그리고 자체 등록합니다 데이터베이스 백엔드 서비스 :

<scr:component ...> 
    ... 
    <property name="backend" type="String" value="database"/> 
</scr:component> 
관련 문제