欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Spring中接口的bean是如何注入的

 更新時(shí)間:2020年06月14日 11:29:09   投稿:daisy  
這篇文章主要介紹了詳解Spring中接口的bean是如何注入的的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

Question:

這個(gè)問(wèn)題困擾了我好久,一直疑問(wèn)這個(gè)接口的bean是怎么注入進(jìn)去的?因?yàn)橹豢吹绞褂聾Service注入了實(shí)現(xiàn)類serviceImpl,使用時(shí)怎么能獲取的接口,而且還能調(diào)用到實(shí)現(xiàn)類的方法,難道這個(gè)接口是在什么時(shí)候自動(dòng)注入了進(jìn)去,且和實(shí)現(xiàn)類關(guān)聯(lián)上了?

接口

public interface TestService {
  public String test();
}

實(shí)現(xiàn)類impl

@Service
public class TestServiceImpl implements TestService {
  @Override
  public String test() {
    return "TestServiceImpl";
  }
}

Controller的調(diào)用:

@RestController
public class TestCtl {
  @Autowired
  private TestService testService;

  @RequestMapping("/test")
  public String test() {
    return testService.test();
  }
}

請(qǐng)求結(jié)果:

Answwer:

后來(lái)才知道,并沒(méi)有注入接口的bean,只注入了實(shí)現(xiàn)類serviceImpl的bean,接口只是用來(lái)接收的。

這里就要說(shuō)到@Autowired/@Resource的注入原理了:@Autowired是Spring的注解,Autowired默認(rèn)先按byType,如果發(fā)現(xiàn)找到多個(gè)bean,則,又按照byName方式比對(duì),如果還有多個(gè),則報(bào)出異常;@Resource 是JDK1.6支持的注解,默認(rèn)按照名稱(Byname)進(jìn)行裝配, 如果沒(méi)有指定name屬性,當(dāng)注解寫(xiě)在字段上時(shí),默認(rèn)取字段名,按照名稱查找,如果注解寫(xiě)在setter方法上默認(rèn)取屬性名進(jìn)行裝配。當(dāng)找不到與名稱匹配的bean時(shí)才按照類型進(jìn)行裝配。但是需要注意的是,如果name屬性一旦指定,就只會(huì)按照名稱進(jìn)行裝配。

再來(lái)說(shuō)Controller獲取實(shí)例的過(guò)程:使用@Autowired,程序在spring的容器中查找類型是TestService的bean,剛好找到有且只有一個(gè)此類型的bean,即testServiceImpl,所以就把testServiceImpl自動(dòng)裝配到了controller的實(shí)例testService中,testService其實(shí)就是TestServiceImpl實(shí)現(xiàn)類;

如果使用的是@Resource,則是先在容器中查找名字為testService的bean,但并沒(méi)有找到,因?yàn)槿萜髦械腷ean名字是TestServiceImpl(如果@Service沒(méi)指定bean的value屬性,則注入bean的名字就是類名,如果指定了則是指定的名字),然后再通過(guò)類型查找TestService類型的bean,找到唯一的了個(gè)TestService類型bean(即TestServiceImpl),所以就自動(dòng)裝配實(shí)例成功了。更多面試題,歡迎關(guān)注公眾號(hào)Java面試題精選

Note:

byName 通過(guò)參數(shù)名 自動(dòng)裝配,如果一個(gè)bean的name 和另外一個(gè)bean的 property 相同,就自動(dòng)裝配。

byType 通過(guò)參數(shù)的數(shù)據(jù)類型自動(dòng)自動(dòng)裝配,如果一個(gè)bean的數(shù)據(jù)類型和另外一個(gè)bean的property屬性的數(shù)據(jù)類型兼容,就自動(dòng)裝配

效率上來(lái)說(shuō)@Autowired/@Resource差不多,不過(guò)推薦使用@Resource一點(diǎn),因?yàn)楫?dāng)接口有多個(gè)實(shí)現(xiàn)時(shí)@Resource直接就能通過(guò)name屬性來(lái)指定實(shí)現(xiàn)類,而@Autowired還要結(jié)合@Qualifier注解來(lái)使用,且@Resource是jdk的注釋,可與Spring解耦。

Question:

如果一個(gè)接口有多個(gè)實(shí)現(xiàn)類時(shí),通過(guò)注解獲取實(shí)例時(shí)怎么知道應(yīng)該獲取的是哪一個(gè)實(shí)現(xiàn)類serviceImpl呢?

再增加了一個(gè)實(shí)現(xiàn)類TestServiceImpl2

@Service
public class TestServiceImpl2 implements TestService {
  @Override
  public String test() {
    return "TestServiceImpl2";
  }
}

Answer:

多個(gè)實(shí)現(xiàn)類的話可通過(guò)以下2種方式來(lái)指定具體要使用哪一個(gè)實(shí)現(xiàn):

1、 通過(guò)指定bean的名字來(lái)明確到底要實(shí)例哪一個(gè)類

@Autowired 需要結(jié)合@Qualifier來(lái)使用,如下:

@Autowired
@Qualifier("testServiceImpl")
private TestService testService;

@Resource可直接通過(guò)指定name屬性的值即可,不過(guò)也可以使用@Qualifier(有點(diǎn)多此一舉了…)

@Resource(name = "testServiceImpl")
private TestService testService;  

@Resource如果不顯示的指定name值,就會(huì)自動(dòng)把實(shí)例變量的名稱作為name的值的,所以也可以直接這樣寫(xiě):

@Resource
private TestService testServiceImpl;

2、 通過(guò)在實(shí)現(xiàn)類上添加@Primary注解來(lái)指定默認(rèn)加載類

@Service
@Primary
public class TestServiceImpl2 implements TestService {
  @Override
  public String test() {
    return "TestServiceImpl2";
  }
}

這樣如果在使用@Autowired/@Resource獲取實(shí)例時(shí)如果不指定bean的名字,就會(huì)默認(rèn)獲取TestServiceImpl2的bean,如果指定了bean的名字則以指定的為準(zhǔn)。

Question:

為什么非要調(diào)用接口來(lái)多此一舉,而不直接調(diào)用實(shí)現(xiàn)類serviceImpl的bean來(lái)得簡(jiǎn)單明了呢?

Answer:

1、 直接獲取實(shí)現(xiàn)類serviceImpl的bean也是可以的;

2、 至于加一層接口的原因:一是AOP程序設(shè)置思想指導(dǎo),給別人調(diào)用的接口,調(diào)用者只想知道方法和功能,而對(duì)于這個(gè)方法內(nèi)部邏輯怎么實(shí)現(xiàn)的并不關(guān)心;二是可以降低各個(gè)模塊間的關(guān)聯(lián),實(shí)現(xiàn)松耦合、程序分層、高擴(kuò)展性,使程序更加靈活,他除了在規(guī)范上有卓越貢獻(xiàn)外,最精髓的是在多態(tài)上的運(yùn)用;繼承只能單一繼承,接口卻可以多實(shí)現(xiàn)

3、 當(dāng)業(yè)務(wù)邏輯簡(jiǎn)單,變更較少,項(xiàng)目自用時(shí),省略掉接口直接使用實(shí)現(xiàn)類更簡(jiǎn)單明了;反之則推薦使用接口;

總結(jié)

到此這篇關(guān)于詳解Spring中接口的bean是如何注入的文章就介紹到這了,更多相關(guān)Spring接口的bean注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java字符串轉(zhuǎn)成二進(jìn)制碼的方法

    Java字符串轉(zhuǎn)成二進(jìn)制碼的方法

    這篇文章主要為大家詳細(xì)介紹了Java字符串轉(zhuǎn)成二進(jìn)制碼的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一
    2017-05-05
  • Java基礎(chǔ)之static關(guān)鍵字的使用講解

    Java基礎(chǔ)之static關(guān)鍵字的使用講解

    這篇文章主要介紹了Java基礎(chǔ)之static關(guān)鍵字的使用講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 使用java + selenium + OpenCV破解網(wǎng)易易盾滑動(dòng)驗(yàn)證碼的示例

    使用java + selenium + OpenCV破解網(wǎng)易易盾滑動(dòng)驗(yàn)證碼的示例

    這篇文章主要介紹了使用java + selenium + OpenCV破解網(wǎng)易易盾滑動(dòng)驗(yàn)證碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Java數(shù)組的遍歷與求和知識(shí)點(diǎn)

    Java數(shù)組的遍歷與求和知識(shí)點(diǎn)

    本篇文章給大家總計(jì)了Java數(shù)組的遍歷與求和的知識(shí)點(diǎn)以及需要注意的地方,需要的朋友參考學(xué)習(xí)下。
    2018-02-02
  • java分布式面試降級(jí)組件Hystrix的功能特性

    java分布式面試降級(jí)組件Hystrix的功能特性

    這篇文章主要為大家介紹了java分布式面試關(guān)于降級(jí)組件Hystrix的功能特性回答,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-03-03
  • 解決mybatis plus 一對(duì)多分頁(yè)查詢問(wèn)題

    解決mybatis plus 一對(duì)多分頁(yè)查詢問(wèn)題

    這篇文章主要介紹了解決mybatis plus 一對(duì)多分頁(yè)查詢問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • 舉例講解Java設(shè)計(jì)模式編程中模板方法模式的運(yùn)用實(shí)例

    舉例講解Java設(shè)計(jì)模式編程中模板方法模式的運(yùn)用實(shí)例

    這篇文章主要介紹了Java設(shè)計(jì)模式編程中模板方法模式的運(yùn)用實(shí)例,模板方法模式強(qiáng)調(diào)基于繼承的代碼復(fù)用,需要的朋友可以參考下
    2016-05-05
  • 深入解析Java中volatile的底層原理

    深入解析Java中volatile的底層原理

    這篇文章主要介紹了深入解析Java中volatile的底層原理,volatile關(guān)鍵字用于保證變量的可見(jiàn)性和禁止指令重排序,即當(dāng)一個(gè)線程修改了volatile變量的值,其他線程能夠立即看到這個(gè)變量的最新值,而不是使用緩存中的舊值,需要的朋友可以參考下
    2023-07-07
  • myBatis使用@GeneratedValue(generator?=?“...“,?strategy?=?...)注解

    myBatis使用@GeneratedValue(generator?=?“...“,?strategy?=?

    這篇文章主要介紹了myBatis使用@GeneratedValue(generator?=?“...“,?strategy?=?...)注解問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java排序之Comparable和Comparator比較器詳解

    Java排序之Comparable和Comparator比較器詳解

    這篇文章主要介紹了Java排序之Comparable和Comparator比較器詳解,Comparable<T>是內(nèi)部比較器,Comparator<T>是外部比較器,最推薦使用Comparator<T>接口排序,Comparator提供靜態(tài)方法很方便,推薦使用,需要的朋友可以參考下
    2024-01-01

最新評(píng)論