2014-12-12 5 views
0

을 제공하는 인터페이스를 기반으로 iPojo 공장을 얻으려면 인터페이스를 기반으로 주입하는 것. 동일한 인터페이스에 대해 두 가지 의미가 있다면 어떤 알고리즘 (서비스 순위?)을 기반으로 선택합니다.방법은

이제 이벤트를 기반으로 필요에 따라 작성해야하는 서비스의 다중 수준이 필요한 경우, org.apache.felix.ipojo.Factory를 사용하고 그것을 통해 인스턴스를 구성해야합니다. 내가 가진 문제는 내가

@Bind 
public void bindService(org.apache.felix.ipojo.Factory myFactory) { 
} 

이 모호 즉 공장

의 인스턴스 만 인터페이스를 사용하여 주입 한있는 공장 지정하는 방법을 발견하지 않은 것입니다. 필자가 공장에 주입 할 수있는 유일한 방법은 @Bind(filter="(factory.name=myServiceFactoryImpl)"을 사용하는 것이지만 이것은 소비자를 구체적인 공급자와 연결시켜 주므로 OSGi 서비스의 모든 부분을 무력화시킵니다. 내가 원하는 것은 영어로 "MyService 인터페이스를 구현하는 팩토리에 나를 바인딩"입니다. 같은 인터페이스의 프로 바이더의 팩토리가 많은 경우는, 인스턴스를 직접 인젝션하는 경우와 같은 명확성의기구를 사용할 필요가 있습니다. 이것이 가능한가?

답변

2

그냥 생성 된 인스턴스에 의해 노출 된 인터페이스를 나열하는 component.providedServiceSpecifications 속성을 사용하여 필터를 사용

@Requires(filter="(component.providedServiceSpecifications=org.acme.Foo)") 
Factory[] factories; 
+0

안녕 클레멘트, 나는 또한 당신의 의견을 기다리고있었습니다. 고맙습니다! 나는 그것이 이런 식으로되기를 바랐다. 분명히'provide.specification ='시도가있었습니다. 그것이 내가 사용할 권리가 있다는 것을 어떻게 알 수 있습니까? 그 (것)들을 목록으로 만드는 방법 있는가? 내가 시도한 것은 * factory * 명령어 출력에서 ​​나온 것입니다. – Hilikus

+0

"Factory"서비스를 노출함으로써 노출 된 서비스 속성을 얻을 수 있습니다. 핸들러는 프로퍼티를 추가 할 수 있으며, 불변 프로퍼티는 Factory 서비스에도 노출되어 있습니다. – Clement

1

MyServiceFactory과 같은 공장 인터페이스를 사용하고 하나의 방법이 MyService create(); 일뿐입니다. 그런 다음 MyServiceFactory의 구현을 작성하고이를 OSGi 서비스로 게시하십시오. 클라이언트는 MyServviceFactory 인터페이스를 Y 인드하고 그의 서비스 인스턴스를 작성할 수 있습니다.

+0

네, 작동,하지만 그 질문은 org.apache.felix '의 포인트는 무엇입니다. ipojo.Factory'? 왜냐하면 나는 인스턴스를 생성하는 것 이상의 역할을한다고 상상할 수 있기 때문입니다. AFAIK 또한 인스턴스의 수명주기를 제어합니다. – Hilikus

+0

ipojo Factory 인터페이스를 사용하면 인스턴스를 만드는 것 이상의 기능을 수행 할 수 있습니다. 나는 당신의 묶음 밖에서 그것을 사용하지 않을 것이다. 그것은 당신이 ipojo를 사용한다는 사실을 드러 낼 것입니다. 나는 당신의 서비스 소비자가 표준 자바에만 노출되어 결합력이 낮아지는 것을 감추려한다. –

+0

그 점에 대해 언급 한 것을 기쁘게 생각합니다. 그것은 ipojo의 가장 큰 불평 중 하나입니다. 팩토리. 그러나 다시 말하지만, 자체 공장을 구현하면 ipojo의 전체 라이프 사이클 관리를 잃게됩니다. 구체적인 예를 들면, 공장 서비스가 사라지면, 생성 된 인스턴스의 소유자는 무엇을 할 것인가? – Hilikus