是否可以通过编程方式创建OSGI服务并解决注入问题

时间:2017-05-04 15:06:22

标签: java osgi cq5 aem apache-felix

不幸的是,我找不到一种方法来使用已解析的引用以编程方式创建osgi服务。众所周知,OSGi将服务创建为单例对象。由于某种原因,我需要手动创建新的服务实例。

案例:

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

    @Reference
    private ConfigurationAdmin configurationAdmin;
}

使用Bundle Context我可以注册我的服务:

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

但是,这种方式 configurationAdmin 在新创建的服务中为空。

问题是是否可以以编程方式创建服务的新实例?

谢谢。

更新:解决方案适用于Felix(OSGi实施)。

1 个答案:

答案 0 :(得分:6)

您可以使用ComponentFactory创建组件的实例。请参阅this article at Vogella

在要以编程方式创建的组件上使用此选项:

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

然后在另一个组件中,您可以获得ComponentFactory:

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

并从中创建一个实例:

ComponentInstance instance = this.factory.newInstance(null);
OneShot shooter = (OneShot) instance.getInstance();