2009-04-23 14 views

답변

1

Declarative Service 가야합니다.

당신은 번들 활성화 및 비활성화되는 방법을 정의 할 수 인터페이스의 service

<service> 
    <provide interface="my.Interface"/> 
    <property name="foo" value="bar" 
</service> 

각 구현으로 사용자 인터페이스를 선언 할 수 있습니다.
하지만 실제로 깔끔한 것은 그 성격입니다. 최신 SCR (새롭고 향상된 OSGi R4.2 DS - Declarative Service - 사양을 구현하는 "Extender 번들"인 "Service Component Runtime")을 사용하는 경우 클래스는 OSGI 모델에서 아무 것도 가져 오지 않습니다. 그들은 순수한 POJO로 남아 있습니다. 서비스를 감지하고 첫 번째 서비스의 모든 콘크리트 인스턴스를 나열하고 의도로 처리됩니다

<reference name="myInterfaceServiceName" 
    interface="my.Interface" 
    bind="myActivationMethod" unbind="myDeactivationMethod" 
    cardinality="0..n"/> 

그건 :

그런 다음 첫 번째 서비스에 따라 다른 서비스를 정의합니다.

자세한 내용은 Eclipse Extensions and Declarative Services 질문을 참조하십시오.

EclipseCON2009의 프레젠테이션 : Component Oriented Development in OSGi with Declarative Services, Spring Dynamic Modules and Apache iPOJO은 구체적인 예를 제공합니다.

+0

이 모델에는 단 하나의 결함이 있습니다. 매우 수동적 인 것처럼 보이기 때문에 번들이 활성화 된 후에 만 ​​찾을 수 있습니다. 활성화되기 전에 사용 가능한 번들 및 해당 내 보낸 유형의 디렉토리를 가져올 수 있기를 희망했습니다. 이것이 가능한가/어떻게? –

+0

번들에 대해 배우기 위해서는 추적기가 있어야하지만 너무 늦었고 활성화/비활성 상태 인 컨트롤을 제어 할 수 없기 때문에 이것이 전적으로 가능하지는 않습니다. –

1

이것은 표준 서비스 레지스트리를 통해 런타임에 상세히 또는 동적으로 선언적으로 수행 할 수 있습니다 (VonC와 유사).

구현자는 서비스로 구현을 등록하고 소비자는 레지스트리에서 가져올 수 있습니다. 이것은 꽤 기본적인 OSGi입니다. 서비스는 속성으로 등록 될 수 있으므로 소비자는 서비스를 찾을 때 구현간에 구별하기 위해 이러한 속성을 사용할 수 있습니다.

+1

네, 저도 알 겠지만 - wht 클래스가 "설치"또는 "활성화"하지 않고 번들에서 내보내는 것처럼 메타 데이터를 읽고 싶습니다. 가능합니다. –

관련 문제