创建Java插件



我有两个java包-package-A和package-B让我们假设这是包的依赖链。

package-A -> package-B

我想传递将在包A中执行的自定义Java函数。我该怎么做?

package-A 
- src
- Foo.java
package-B
- src
- Bar.java
- Tag.java
class Foo implements Tag {
doThis() {
// do what I say.
}
}
------------------------------------------
class Bar {
execute() {
tag.doThis();
}
}
interface Tag {
doThis();
}

我想要某种插件框架,这样包A所有者就可以向库包B的所有用户提供实现,而包B不必依赖包A

OSGi有一个服务注册表插件(捆绑包(可以在其接口名称下注册服务对象。其他插件可以获得该服务。例如,在Tag.java中,我们有:

public interface Tag { void doThis(); }

服务提供商可以提供实现,如下所示:

@Component
public class Foo implements Tag {
@Override
public void doThis() { System.out.println("do what I say"); }
}

@Component注释由OSGi定义。当程序启动时,它将注册一个Tag服务。

下一部分是Bar.java:中的消费者

@Component
public class Bar {
@Activate public Bar( @Reference Tag tag) { tag.doThis(); }
}

@Component将创建Bar的实例,并将Tag服务的实例传递给构造函数,因为它具有@Activate@Reference注释。

作为提示,您希望将使用者、接口和提供者打包在三个不同的捆绑包中。

bndtools视频中显示了这种模式的一个简单示例

最新更新