2011-08-19 48 views
1

這可能很明顯,但我很難理解爲什麼我們需要定義bean的類在兩個地方....爲什麼需要在xml文件中和Spring中的getBean()方法中指定該類

從春天參考手冊... ...

<bean id="petStore" 
class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl"> 
<property name="accountDao" ref="accountDao"/> 
<property name="itemDao" ref="itemDao"/> 
<!-- additional collaborators and configuration for this bean go here --> 
</bean> 

// retrieve configured instance 
PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class); 

不應該XML罰款是不夠的容器知道petStore的類?

回答

1

沒有要求在getBean()方法中指定類。這只是一個安全問題。請注意,還有一個getBean(),它只需要一個類,以便您可以按類型查找bean,而不需要知道名稱。

2

您可以使用下面的方法:

context.getBean("petStore") 

然而,因爲這將返回一個java.lang.Object中,你仍舊需要有一個轉換:

PetStoreServiceImpl petstore = (PetStoreServiceImpl)context.getBean("petStore"); 

然而,這如果你的「petStore」bean實際上不是一個PetStoreServiceImpl,並且爲了避免強制轉換(因爲泛型的出現被認爲有點髒),可能會導致問題,你可以使用上面的方法來推斷它的類型檢查你期望的bean是否屬於正確的類,因此你已經擁有了:

PetStoreServiceImpl service = context.getBean("petStore", PetStoreServiceImpl.class); 

希望有所幫助。

編輯:

就個人而言,我會避免調用context.getBean(),因爲它違背了依賴注入的想法查找方法。實際上,使用petstore bean的組件應該有一個屬性,然後可以使用正確的組件注入該屬性。

private PetStoreService petStoreService; 

// setter omitted for brevity 

public void someotherMethod() { 
    // no need for calling getBean() 
    petStoreService.somePetstoreMethod(); 
} 

然後你可以在應用程序上下文掛鉤豆:

你也可以通過XML廢除的配置和使用註釋要連接你的bean:

@Autowired 
private PetStoreService petStoreService; 

只要你有

在您的spring上下文中,應用程序上下文中定義的「petStore」bean將自動注入。如果你有一個以上的豆與類型「PetStoreService」,那麼你需要添加一個限定詞:

@Autowired 
@Qualifier("petStore") 
private PetStoreService petStoreService; 
+0

儘管如此,從鑄造的getBean(返回值),我們只是移動類從構造函數到演員定義。 – zerayaqob

+0

不知道你的構造函數是什麼意思,但是由於Java編譯器不解析應用程序上下文xml,所以需要通過調用getBean()的結果告訴它需要什麼類型的對象。 – beny23

相關問題