Java 如何在可停靠的应用程序中使用osgi服务?
例如,如果我有一个通过注释作为可停靠窗口的类,我应该如何在该类中使用osgi服务?最好将其作为私有成员字段 例如,您可以使用ServiceTracker:Java 如何在可停靠的应用程序中使用osgi服务?,java,osgi,drombler-fx,Java,Osgi,Drombler Fx,例如,如果我有一个通过注释作为可停靠窗口的类,我应该如何在该类中使用osgi服务?最好将其作为私有成员字段 例如,您可以使用ServiceTracker: import org.osgi.framework.BundleContext; import org.osgi.framework.FrameworkUtil; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; i
import org.osgi.framework.BundleContext;
import org.osgi.framework.FrameworkUtil;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
...
@ViewDocking(...)
public class MyView extends SomeNode{
private final ServiceTracker<MyService, MyService> myServiceTracker;
private MyService myService;
public MyView(){
BundleContext bundleContext = FrameworkUtil.getBundle(MyView.class).getBundleContext();
myServiceTracker = new ServiceTracker<>(bundleContext, MyService.class,
new MyServiceTrackerCustomizer(bundleContext));
myServiceTracker.open(false);
}
...
public void setMyService(MyService myService) {
if (this.myService != null){
...
}
this.myService = myService;
if (this.myService != null){
...
}
}
...
private class MyServiceTrackerCustomizer implements
ServiceTrackerCustomizer<MyService, MyService> {
private final BundleContext context;
public MyServiceTrackerCustomizer(BundleContext context) {
this.context = context;
}
@Override
public MyService addingService(ServiceReference<MyService> reference) {
MyService myService = context.getService(reference);
setMyService(myService);
return myService;
}
@Override
public void modifiedService(ServiceReference<MyService> reference, MyService service) {
addingService(reference);
removedService(reference, service);
}
@Override
public void removedService(ServiceReference<MyService> reference, MyService service) {
setMyService(null);
context.ungetService(reference);
}
}
}
import org.osgi.framework.BundleContext;
导入org.osgi.FrameworkUtil;
导入org.osgi.framework.ServiceReference;
导入org.osgi.util.tracker.ServiceTracker;
导入org.osgi.util.tracker.ServiceTrackerCustomizer;
...
@ViewDocking(…)
公共类MyView扩展了SomeNode{
私人最终服务追踪者myServiceTracker;
私人MyService-MyService;
公共MyView(){
BundleContext BundleContext=FrameworkUtil.getBundle(MyView.class).getBundleContext();
myServiceTracker=新的ServiceTracker(bundleContext、MyService.class、,
新的MyServiceTrackerUserMizer(bundleContext));
myServiceTracker.open(false);
}
...
public void setMyService(MyService MyService){
if(this.myService!=null){
...
}
this.myService=myService;
if(this.myService!=null){
...
}
}
...
私有类myServiceTrackerUserMizer实现
ServiceTrackerCustomizer{
文本语境中的私密性;
公共MyServiceTrackerUserMizer(BundleContext上下文){
this.context=上下文;
}
@凌驾
公共MyService添加服务(ServiceReference){
MyService MyService=context.getService(参考);
setMyService(myService);
返回myService;
}
@凌驾
public void modifiedService(ServiceReference引用,MyService服务){
添加服务(参考);
removedService(参考、服务);
}
@凌驾
public void removedService(ServiceReference引用,MyService服务){
setMyService(null);
ungetService(参考);
}
}
}
还有一个开放的条件是如何使用CDI