2016-02-12 57 views
0

我有一个用@Component和@Service注解的类。从豆容器得到这个类的实例通常使用的方法是使用@Reference:Spring-Roo:如何按名称或编号检索组件实例?

@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

在这里你去:

ApplicationContext context = new ClassPathXmlApplicationContext(
      "classpath*:mySpringConfig.xml"); 
MyClass myClassBean = (MyClass) context.getBean("myClass"); 
+0

如果我正确理解了这个问题,它与osgi声明的服务有关,而不是spring。但我不知道为什么会有一个spring-roo标签:-) –

+0

spring-roo标签是因为我正在开发一个插件。 Spring Roo插件使用OSGi功能,而Roo shell使用osgi命令安装它们。 – Rafa

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); 

如果您在编译时(或通过某种配置)知道您正在寻找的密钥,您可以注入T A参考与目标:

@Reference(target = "(type=xxx)") 
private MySvc component; 

老答案

你应该使用引用的名称。此名称可在@Reference指定,而是从属性的名称,或绑定/解除绑定方法(见本注释的Javadoc)

在您的例子生成的默认,它应该是:

MyClass myclass = (MyClass)context.locateService("myClass"); 

如果您不确定,您可以查看组件中生成的xml,您会看到生成的名称。

+0

谢谢,我会尝试,但我不确定这是我想要的。我已经将我的问题解释了这一点。 – Rafa

+1

最后增加的问题对我没有任何意义。你可以尝试以不同的方式解释它吗? –

+0

好的,对不起。现在试试。 – Rafa