Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建osgi实用程序包有多有用_Java_Osgi_Osgi Bundle - Fatal编程技术网

Java 创建osgi实用程序包有多有用

Java 创建osgi实用程序包有多有用,java,osgi,osgi-bundle,Java,Osgi,Osgi Bundle,我正在尝试使用OSGi框架开发一个简单的应用程序。我的问题涉及到框架中可用的“实用程序包”:让我用一个非常详细的例子来解释。目前,我正在尝试构建一个我的包将发送的事件 据我所知,我需要做的是如下()所示: 现在,由于OSGi应用程序可能有很多bundle,我想为每个bundle创建一个子类Event(例如,我有一个名为“BundleExample”的bundle?在它的导出类中会有一个“BundleExampleEvent”)。我知道这并没有添加任何信息,因为你可以通过查看“主题”来知道你收到了

我正在尝试使用OSGi框架开发一个简单的应用程序。我的问题涉及到框架中可用的“实用程序包”:让我用一个非常详细的例子来解释。目前,我正在尝试构建一个我的包将发送的事件

据我所知,我需要做的是如下()所示:

现在,由于OSGi应用程序可能有很多bundle,我想为每个bundle创建一个子类Event(例如,我有一个名为“BundleExample”的bundle?在它的导出类中会有一个“BundleExampleEvent”)。我知道这并没有添加任何信息,因为你可以通过查看“主题”来知道你收到了哪些活动,但请暂时耐心等待

现在,
事件
构造函数需要一个主题和一个
映射
。但是,为了“简化”事件构造函数,我只希望将主题和参数列表放在映射中。例如,以下是BundleExampleEvent类:

public class BundleExampleEvent extends Event{

    private int importantVariable;

    public BundleExampleEvent(String topic, int importantVariable) {
        super(topic, Utils.toMap("importantVariable", importantVariable));
        //here toMap is static
    }

    public int getImportantVariable() {
        return this.importantVariable;
    }   
}
好的,请注意
Utils.toMap
:这是一个函数,允许您将
字符串、对象
序列转换为
映射
。好的,现在
Utils
是一个实用类的例子(愚蠢、无用,但仍然是一个实用类)。本着OSGi的精神,我想让这个实用程序类也成为一个bundle:我的想法是在框架启动时启动这个Utils bundle,然后每当我需要它的一个实用程序时,我就想通过
@reference
注释获取一个引用

这在任何捆绑包接口实现中都非常有效,如下所示:

@Component
public class BundleExampleImpl implements BundleExample {
   @Reference
   private Utils utils;

   @Override
   public String sayHello() {
      return this.utils.fetchHello();
      //another useless utility function, but hopefully it conveys what i'm trying to do
   }
}
public class BundleExampleEvent extends Event{
    @Reference
    private Utils utils;
    private int importantVariable;

    public BundleExampleEvent(String topic, int importantVariable) {
        super(topic, Utils.toMap("importantVariable", importantVariable));
        //here toMap is static
    }

    public int getImportantVariable() {
        return this.importantVariable;
    }   
}
但是其他类呢(即BundleExampleImpl在工作期间调用的类)?例如,
BundleExampleEvent
?我需要从
sayHello
方法调用它,我还想在该类中使用该实用程序来计算映射!在前面的示例中,我使用了一个静态函数,但我想使用OSGi给我的
Utils
reference

当然,为了满足链接,我可以在
BundleExampleEvent
的构造函数中添加一个参数,但我宁愿不这样做,因为依赖于“实用程序类”的东西是非常愚蠢的;我的问题是:

  • 如果我想要“实用程序包”,这是唯一可用的方法吗
  • 或者我可以做一些奇怪的事情,比如在我的
    BundleExampleEvent
    中添加util的引用;i、 例如:

    @Component
    public class BundleExampleImpl implements BundleExample {
       @Reference
       private Utils utils;
    
       @Override
       public String sayHello() {
          return this.utils.fetchHello();
          //another useless utility function, but hopefully it conveys what i'm trying to do
       }
    }
    
    public class BundleExampleEvent extends Event{
        @Reference
        private Utils utils;
        private int importantVariable;
    
        public BundleExampleEvent(String topic, int importantVariable) {
            super(topic, Utils.toMap("importantVariable", importantVariable));
            //here toMap is static
        }
    
        public int getImportantVariable() {
            return this.importantVariable;
        }   
    }
    
  • 或者,也许拥有一个“实用捆绑包”的整个想法只是纯粹的垃圾


  • 谢谢你的回复。希望我能以最清晰的方式表达我的问题

    在你的情况下,Utils将是一个OSGi服务。然后,您希望在不是BundleExampleEvent之类的服务的对象中使用此服务

    您可以创建一个服务来创建BundleExampleEvent实例并使用OSGi服务为其提供服务。有点像一个工厂作为一种服务。问题是OSGi中的服务是动态的。如果BundleExampleEvent实例所需的服务消失,则必须丢弃该对象。因此,这只适用于寿命较短的对象

    在eventadmin示例中,另一种解决方案是不使用特殊的事件类,而是创建一个具有发送此类事件的方法的服务。然后所有的魔法都会在这个方法中发生,结果将是一个没有进一步逻辑的事件。您还可以使用DS将EventAdmin注入到该服务中。 这在OSGI中非常有效,但有贫血域模型()的缺点


    我不确定更喜欢哪种变体。

    我认为UTIL作为一种服务没有任何意义。只有当它们可以有多个实现时,才应该是一个服务。在您的情况下,Util功能的使用者只需要一个实现。。。执行是合同的一部分


    我甚至不认为utils代码应该是一个捆绑包。只需将其放入一个库中,该库静态链接到需要它的bundle中。

    根据我的理解,为了避免将Utils的引用放在构造函数中,我需要创建另一个服务来实现这一目的。听起来好像有很多代码都没用。我认为我最好的选择是在构造函数中传递Utils实例,或者放弃Utils包。在您看来,哪一个是OSGi最友好的选择?我是OSGi n00bie,所以我不确定最佳解决方案。谢谢如果您的Utils类不需要服务或具有静态方法,那么只需像在普通java中一样使用它。你不需要注射它。因此,您可以在事件对象内部调用此类方法,而无需任何构造函数注入。顺便说一句,我不确定是否建议使用专门的事件类。至少我从来没见过。我认为专业化活动实际上是无用的。。。你从专业化他们中得到的唯一东西就是一些能手和二传手。关于实用程序类。。。我不确定,因为如果实用程序类中有bug,解决它的唯一方法是手动停止框架,更新类,然后重新启动它;如果它是一个OSGi注入包,我可以自己更新包。我认为我们现在处于一个容易编码的健壮性权衡场景中。您已经看过实用程序类捆绑包了吗?只是为了了解我的解决方案是否已被其他人使用!在很多情况下,类直接用于OSGi。所有简单的库都是这样工作的。只要您的类不需要配置或其他服务,就可以简单地用新方法或使用静态方法实例化它。但是要注意名为Util的类或包。它们往往吸引各种各样的方法。因此,它们的内聚性很低,并且间接地耦合了不应该相关的类。关于运行时的更新。这仍然可以工作,但您必须使用t刷新并重新启动所有捆绑包