最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

Question:

這個問題困擾了我好久,一直疑問這個接口的bean是怎么注入進去的?因為只看到使用@Service注入了實現(xiàn)類serviceImpl,使用時怎么能獲取的接口,而且還能調(diào)用到實現(xiàn)類的方法,難道這個接口是在什么時候自動注入了進去,且和實現(xiàn)類關聯(lián)上了?

接口

public interface TestService {
  public String test();
}

實現(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();
  }
}

請求結(jié)果:

Answwer:

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

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

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

如果使用的是@Resource,則是先在容器中查找名字為testService的bean,但并沒有找到,因為容器中的bean名字是TestServiceImpl(如果@Service沒指定bean的value屬性,則注入bean的名字就是類名,如果指定了則是指定的名字),然后再通過類型查找TestService類型的bean,找到唯一的了個TestService類型bean(即TestServiceImpl),所以就自動裝配實例成功了。更多面試題,歡迎關注公眾號Java面試題精選

Note:

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

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

效率上來說@Autowired/@Resource差不多,不過推薦使用@Resource一點,因為當接口有多個實現(xiàn)時@Resource直接就能通過name屬性來指定實現(xiàn)類,而@Autowired還要結(jié)合@Qualifier注解來使用,且@Resource是jdk的注釋,可與Spring解耦。

Question:

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

再增加了一個實現(xiàn)類TestServiceImpl2

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

Answer:

多個實現(xiàn)類的話可通過以下2種方式來指定具體要使用哪一個實現(xiàn):

1、 通過指定bean的名字來明確到底要實例哪一個類

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

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

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

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

@Resource如果不顯示的指定name值,就會自動把實例變量的名稱作為name的值的,所以也可以直接這樣寫:

@Resource
private TestService testServiceImpl;

2、 通過在實現(xiàn)類上添加@Primary注解來指定默認加載類

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

這樣如果在使用@Autowired/@Resource獲取實例時如果不指定bean的名字,就會默認獲取TestServiceImpl2的bean,如果指定了bean的名字則以指定的為準。

Question:

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

Answer:

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

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

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

總結(jié)

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

相關文章

最新評論

自贡市| 新闻| 仙游县| 美姑县| 常熟市| 通江县| 昭通市| 迁西县| 农安县| 乌拉特前旗| 抚顺市| 连城县| 江川县| 新宾| 长丰县| 夏邑县| 开平市| 昂仁县| 馆陶县| 富锦市| 桃园县| 彰武县| 隆化县| 板桥市| 海阳市| 安平县| 来宾市| 巴南区| 金乡县| 宁陵县| 霍邱县| 晋州市| 大埔县| 长岛县| 碌曲县| 马龙县| 江陵县| 黄山市| 宜兰县| 射阳县| 班戈县|