我有一个用@Component和@Service注释的类。从bean容器中获取此类实例的常用方法是使用@Reference:
@Reference private MyClass myclass;
我如何使用字符串键检索实例,就像在Spring Web应用程序中使用ApplicationContext一样?我尝试过使用ComponentContext.locateService,但我不知道这是否正确,也不知道我必须使用哪个键值。
MyClass myclass = (MyClass)context.locateService("????"); //Which is the way?
我编辑我的问题,我会尝试更好地解释。 我有一个这样的课:
@Component
@Service
class MySvcImpl implements MySvc { ... }
以这种方式注入:
class Main {
@Reference private MySvc svc;
void method1(){
svc.doXXX();
}
}
在这种情况下,我有一个班级。我想要一堆组件子类(MySvcSubX),以便我可以根据参数使用它们中的任何一个。据称,我不再需要@Reference线了。
@Component
@Service
class MySvcSub1Impl extends MySvcImpl implements MySvc { ...}
//The same with MySvcSub2Impl, 3, and so forth
然后在我的主课堂中:
void method1(String key){
MySvc svc = callToLocateBeanById(key);
}
我不需要为每个子类添加一个引用,以便能够按名称找到它们。
答案 0 :(得分:0)
你走了:
ApplicationContext context = new ClassPathXmlApplicationContext(
"classpath*:mySpringConfig.xml");
MyClass myClassBean = (MyClass) context.getBean("myClass");
答案 1 :(得分:0)
您可以使用属性发布@Component
:
@Component(property="type=xxx")
public class MyComponent implements MySvc {
}
然后使用此属性上的过滤器查询osgi注册表:
BundleContext bc = ..;
Collection<ServiceReference<MySvc>> ref = bc.getServiceReferences(MySvc.class, "(type=xxx)")
// check cardinality, etc
MySvc svc = bc.getService(ref);
// use svc
bc.ungetService(ref);
如果您在编译时(或通过某些配置)知道要查找的密钥,则可以使用目标注入引用:
@Reference(target = "(type=xxx)")
private MySvc component;
旧答案
您应该使用引用的名称。此名称可以在@Reference
中指定,但默认值是从属性名称或bind / unbind方法生成的(请参阅此批注的javadoc)
在您的示例中,它应该是:
MyClass myclass = (MyClass)context.locateService("myClass");
如果您不确定,可以查看组件中生成的xml,您将看到生成的名称。