亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

用@Autowired的時候,到底是寫接口的名字還是實現類的名字呢?

有一點沒明白,為什么注解@repository注解的是接口InjectionDAO的實現類InjectionDAOImpl,而在InjectionServiceImpl中定義的屬性InjectionDAO injectionDAO自動裝配,為什么最后得到的是InjectionDAOImpl的實例。

-----上面是某位同學的提問,我也有這樣的疑問----

@Service注解服務層的時候,在unitest中,是從ApplicationContext.getBean("實現類名字,首字母小寫") 這樣獲取的。

也就是說,在容器中初始化的Bean應該按照實現類名字規則。 這一點如果是用xml配置是不存在這樣的問題,因為xml可以指定id, id 是接口,class指向實現類。?

可以當老師講 InjectionDAO 注入的時候,我以為也是需要?InjectionDAO injectionDAOImpl;這樣來注入的,因為容器中存在的bean名字應該是@Repository注解的實現類,InjectionDAOImpl。

可以老師的例子是用接口名字的, ?有其他規則? ?

正在回答

2 回答

這個其實是創建了實現類的對象但引用了接口類型,即"InjectionDao injectionDao = new InjectionDaoImpl()", 這個其實是Java多態性(向上轉型)的一種應用。在實現類處加@Repository注解,意思就是new InjectionDaoImpl(), 而在InjectionServiceImpl中定義屬性InjectionDAO injectionDAO就是將new出來的這個InjectionDaoImpl對象向上轉型為InjectionDao類型。

0 回復 有任何疑惑可以回復我~

自問自答一下,查完資料,@Autowired默認是按照byType查找,然后byType也不能說明直接查找到實現類呀。

Hmm,沒有查到文檔,我想在初始化容器的時候,掃面類的時候,容器也記下了每個類實現了哪些接口。 然后當你用接口的引用時,容器給你autowired一個實現類的實例了。 PS:當我創建了2個類,實現同一接口的時候,報錯了。 發現有2個類實現同一接口,改從byName查找了

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.ken.study.spring_study.DAOSave] is defined: expected single matching bean but found 2: DAOSaveImpl,DAOSaveImpl2

這個時候呢,應該配合@Qualifier來用,存在多個實現類,可以指定名字,

不過比較有趣,看上面exception信息,這個時候用@Repository注解的DAO兩個實現類,bean名字不是首字母小寫,而是大寫.......


4 回復 有任何疑惑可以回復我~
#1

慕娘6527991

我自己寫的時候也碰到奇怪的問題,最開始沒有寫默認構造器導致出現不能實例化這個service類,后來加上默認構造方法,沒有setter方法,也沒有含參構造方法,居然能把屬性給賦值上去,確實挺強大的。聯想下之前的byType、byName、constructor,這個autowired應該是綜合了三種方法。并且這個三種方法實現和setter和構造器注入是不一樣的,否則沒有setter沒有含參構造器,autowired還能注入,肯定是因為byType和構造器與setter注入是不一樣的方法
2018-09-20 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

用@Autowired的時候,到底是寫接口的名字還是實現類的名字呢?

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號