2 回答

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
spring如何知道要使用哪種多態(tài)類(lèi)型。
只要接口只有一個(gè)實(shí)現(xiàn),并且該實(shí)現(xiàn)在@Component啟用了Spring的組件掃描的情況下進(jìn)行注釋?zhuān)琒pring框架就可以找出(接口,實(shí)現(xiàn))對(duì)。如果未啟用組件掃描,則必須在application-config.xml(或等效的spring配置文件)中顯式定義Bean。
我需要@Qualifier或@Resource嗎?
一旦擁有多個(gè)實(shí)現(xiàn),就需要對(duì)每個(gè)實(shí)現(xiàn)進(jìn)行限定,并且在自動(dòng)裝配期間,需要使用@Qualifier注釋將正確的實(shí)現(xiàn)以及@Autowired注釋注入。如果使用@Resource(J2EE語(yǔ)義),則應(yīng)使用name此批注的屬性指定Bean名稱(chēng)。
為什么我們要對(duì)接口而不是已實(shí)現(xiàn)的類(lèi)進(jìn)行自動(dòng)裝配?
首先,一般來(lái)說(shuō),對(duì)接口進(jìn)行編碼始終是一個(gè)好習(xí)慣。其次,在spring的情況下,您可以在運(yùn)行時(shí)注入任何實(shí)現(xiàn)。一個(gè)典型的用例是在測(cè)試階段注入模擬實(shí)現(xiàn)。
interface IA
{
public void someFunction();
}
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
....
worker.someFunction();
}
您的bean配置應(yīng)如下所示:
<bean id="b" class="B" />
<bean id="c" class="C" />
<bean id="runner" class="MyRunner" />
或者,如果在存在這些組件的軟件包上啟用了組件掃描,則應(yīng)按以下步驟對(duì)每個(gè)類(lèi)別進(jìn)行限定@Component:
interface IA
{
public void someFunction();
}
@Component(value="b")
class B implements IA
{
public void someFunction()
{
//busy code block
}
public void someBfunc()
{
//doing b things
}
}
@Component(value="c")
class C implements IA
{
public void someFunction()
{
//busy code block
}
public void someCfunc()
{
//doing C things
}
}
@Component
class MyRunner
{
@Autowire
@Qualifier("b")
IA worker;
....
worker.someFunction();
}
然后worker在MyRunner中將注入type的實(shí)例B。
添加回答
舉報(bào)