Spring-Roo:如何通过名称或ID来动态检索组件实例?

时间:2016-02-12 10:12:25

标签: java osgi spring-roo

我有一个用@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);
}

我不需要为每个子类添加一个引用,以便能够按名称找到它们。

2 个答案:

答案 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,您将看到生成的名称。