我想创建类似' BundleLocal '变量的内容,就像 ThreadLocal 变量一样,但不是通过Thread.currentThread()
查找它们我需要查看它们捆绑上下文。
关键是我有一个框架插件'F',以及其他使用该框架的插件'A','B'等。该框架包含一个我想重构的单例,这样我每个包有一个单例实例。然后MySingleton.getInstance()
将为每个插件创建/返回一个专用实例。问题是在MySingleton.getInstance()
内我需要找出哪个插件('A','B',..)称为该方法。
我可以用黑客攻击,用
获取调用堆栈StackTraceElement[] ste=new Throwable().getStackTrace();
然后按类查询每个元素的bundle上下文:
org.osgi.framework.FrameworkUtil.getBundle(Class c).getBundleContext()
但真心希望有更好的方法从框架'F'中获取bundle上下文或bundle id。
关于如何更优雅地做这件事的任何建议?
答案 0 :(得分:1)
我建议从呼叫来源注入信息,而不是试图确定它来自何处。像这样:
MyMultiton.getInstance(bundleContext)
答案 1 :(得分:1)
由于OSGi(及其孤立的类加载器)的模块化特性,单例不起作用(正如您所发现的那样)。
如果您正在重构,一个选项就是简单地添加间接。在ActivatorA中:
public static Singleton getSingleton() {
Framework.getSingleton(BUNDLE_ID);
}
然后插件A使用ActivatorA.getSingleton()
,插件B使用ActivatorB.getSingleton()。
另一种可能的方法是提供ComponentFactory并使用Declarative Service将适当的Component(OSGi服务)注入插件A和插件B(每个人都获得自己的Component实例)。但这是我第一个例子的一个更动态,更分离的实现。