2016-02-12 62 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