java - 更新 IPOJO 组件实现

标签 java ipojo

我还有一个与 iPOJO 动态更新相关的问题:

<强>1。问题:

  • 假设我有2个组件A和B。这两个组件分别由A_impl.java和B_impl.java实现。他们实现了两个服务 A_service 和 B_service。
  • 组件“C”使用 A_service 声明如下:

//

@Component(name="C", immediate=true)
@Instantiate
public class C_impl {
        @Requires
        A_Service service;
}

//

  • 所有三个组件均已部署并正常工作。

<强>2。要求:

  • 现在,我将通过将 C_impl.java 中的依赖类型(@Requires A_service 服务)更改为(@Requires B_service 服务)来动态更新“C”的实现,即在运行时将 C_impl 中的 A_service 更改为 B_service。

问题:

如何开发独立组件来重新配置(控制)组件实现?我读了(http://felix.apache.org/site/dive-into-the-ipojo-manipulation-depths.html),但我不太明白。 预先感谢您的回复

最佳答案

那么,您想更改组件的组件类吗?这不会真正起作用。

唯一的方法是在不声明实例的情况下提供两个实现(无@instantiate),并创建一个需要两个工厂(org.apache.felix.ipojo.Factory 服务)的组件,并在需要时创建实例。显然,如果您需要替换,您还需要在创建第二个实例时处置第一个创建的实例。

所以,它需要一个像这样的组件(这是伪代码):

@Component(immediate=true)
@Instantiate
public class Controller {

    @Requires(filter="(factory.name=A)")
    Factory factoryOfA;

    @Requires(filter="(factory.name=B)")
    Factory factoryOfB;    

    ComponentInstance instance;

    @Validate
    public void createA() throws Exception {
        instance = factoryOfA.createInstance(null);
    }

    public void switchToB() throws Exception {
        instance.dispose();
        instance = factoryOfB.createInstance(null);
    }
}

关于java - 更新 IPOJO 组件实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26844739/

相关文章:

java - 捕获异常后,模拟器仍然显示 "Application has stopped unexpectedly "

java - FAILURE 构建失败并出现异常

java - LibGdx 如何编程 HP Bar?

java - hibernate 一个iPOJO组件,全部禁用

java - 如何在 Eclipse 中使用 BndTools 设置 iPojo?

java - 像 Java 桌面应用程序一样嵌入 Apache felix Ipojo

java - Kotlin:链表实现

java - 更新到 API 27 后 RecyclerView Adapter 出现问题

java - org.osgi.* 的包导入是否有不同的处理方式?