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

Java 可以通过编程方式创建OSGI服务并解决注入问题吗,java,osgi,aem,apache-felix,Java,Osgi,Aem,Apache Felix,不幸的是,我找不到一种方法以编程方式使用解析的引用创建osgi服务。众所周知,OSGi将服务创建为单例对象。由于某些原因,我需要手动创建新的服务实例 本案: @Service(ICasualService.class) @Component(immediate = true, label = "Casual Service") public class CasualService implements ICasualService { @Reference private Co

不幸的是,我找不到一种方法以编程方式使用解析的引用创建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在新创建的服务中为空

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

多谢各位


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

您可以使用ComponentFactory创建组件实例。看

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

@Component(factory="fipro.oneshot.factory")
然后在另一个组件中,您可以获得组件工厂:

@Reference(target = "(component.factory=fipro.oneshot.factory)")
    private ComponentFactory factory;
并从中创建一个实例:

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

非常感谢你!它起作用了。此外,1。通过这种方式,您可以通过将配置参数传递到这个.factory.newInstance(Dictionary)方法来创建具有适当配置参数的新服务;2.它创建新的服务实例(在case.newInstance(null)中,它每次返回相同的对象)。