2017-05-04 7 views
3

불행히도 해결 된 참조로 프로그래밍 방식으로 osgi 서비스를 만드는 방법을 찾지 못했습니다. OSGi가 싱글 톤 객체로 서비스를 생성한다는 것은 잘 알려진 사실입니다. 어떤 이유로 새로운 서비스 인스턴스를 수동으로 만들어야합니다.주입으로 프로그래밍 방식으로 OSGI 서비스를 만들 수 있습니까?

사건 :

@Service(ICasualService.class) 
@Component(immediate = true, label = "Casual Service") 
public class CasualService implements ICasualService { 

    @Reference 
    private ConfigurationAdmin configurationAdmin; 
} 

번들 컨텍스트를 사용하여 나는 나의 서비스를 등록 할 수 있어요 :

private BundleContext bundleContext; 
ICasualService casualService = new CasualService(); 
Dictionary props = new Properties(); 
bundleContext.registerService(ICasualService.class.getName(), casualService, props); 

그러나,이 방법 configurationAdmin 새로운 생성 서비스에 null입니다.

질문은 프로그래밍 방식으로 서비스의 새 인스턴스를 만들 수 있는지 여부입니다.

감사합니다.

업데이트 : 해결 방법은 Felix (OSGi 구현)에서 작동해야합니다.

답변

5

ComponentFactory를 사용하여 구성 요소의 인스턴스를 만들 수 있습니다. this article at Vogella을 참조하십시오. 그것에서 인스턴스를

@Reference(target = "(component.factory=fipro.oneshot.factory)") 
    private ComponentFactory factory; 

만들 :

@Component(factory="fipro.oneshot.factory") 

그런 다음 다른 구성 요소에 당신이 ComponentFactory를 얻을 수 있습니다 :

ComponentInstance instance = this.factory.newInstance(null); 
OneShot shooter = (OneShot) instance.getInstance(); 
프로그래밍 방식으로 생성 할 구성 요소에

사용이

+0

대단히 감사합니다! 그것은 작동합니다. 게다가, 1. this.factory.newInstance (Dictionary) 메소드로 전달하여 적절한 구성 매개 변수로 새 서비스를 작성할 수 있습니다. 2. 새로운 서비스 인스턴스를 생성합니다 (.newInstance (null)의 경우 매번 같은 객체를 반환합니다). –