javascript
Spring注释,我从来没有机会使用第1部分:@primary
今天,我想起了我的一個老朋友(@primary),我們從教程到教程都遇到了他。 您知道在Spring @Autowired批注中按類型工作,也就是說,如果Spring找到符合類型的匹配的合格bean,則會將其注入。讓我們在示例中進行查看。
假設我有兩個歌手班; OperaSinger和MetalSinger。
@Component public class MetalSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing with DIO voice: "+lyrics;} }public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;} }它們都實現了Singer接口。
public interface Singer {String sing(String lyrics); }并定義一個SingerService并將Singer bean注入其中。
@Component public class SingerService {private static final Logger logger = LoggerFactory.getLogger(SingerService.class);@Autowiredprivate Singer singer;public String sing(){return singer.sing("song lyrics");} }你怎么看; 哪個歌手會被注入里面? 結果如下:
我用DIO聲音唱歌:歌詞。
這是因為OperaSinger并未定義為Component或Service,因此Spring沒有任何線索。 如果我們向其添加@Component注釋:
@Component public class OperaSinger implements Singer {@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;} }比我將得到此異常:
org.springframework.beans.factory.NoUniqueBeanDefinitionException:沒有定義類型為[main.service.Singer]的合??格bean:期望的單個匹配bean,但找到2:metalSinger,operaSinger
原因很明顯。 如果我有多個具有相同類型的bean,并且使用綁定類型的@Autowired注釋,則將出現此異常。 Spring并不知道應該使用哪個Singer。
讓我們喜歡一種音樂類型,并告訴Spring使用OperaSinger作為Primary。
@Primary @Component public class OperaSinger implements Singer{@Overridepublic String sing(String lyrics) {return "I am singing in Bocelli voice: "+lyrics;} }如果我們進行SingerService調用,則會得到:
"I am singing in Bocelli voice: song lyrics"那是因為我們選擇OperaSinger作為主要對象,這意味著“如果您對類型感到困惑,最好使用此類型”。 另一種方法是使用限定符名稱,將名稱直接映射到bean。
翻譯自: https://www.javacodegeeks.com/2015/04/spring-annotations-i-never-had-the-chance-to-use-part-1-primary.html
總結
以上是生活随笔為你收集整理的Spring注释,我从来没有机会使用第1部分:@primary的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电子备案表怎么打印出来(电子备案表怎么打
- 下一篇: 安卓毕业设计app项目(安卓 毕业设计)