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

java構(gòu)造器復(fù)用方式

 更新時(shí)間:2024年03月26日 08:36:09   作者:chuanzhangsss  
這篇文章主要介紹了java構(gòu)造器復(fù)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

構(gòu)造器復(fù)用

創(chuàng)建一個(gè)Employee類,屬性有(名字,性別,年齡,職位,薪水),提供3個(gè)構(gòu)造方法,可以初始化(⑴)(名字,性別,年齡,職位,薪水),(2)(名字,性別,年齡)(3)(職位,薪水).要求充分復(fù)用構(gòu)造器Hello.java

 public class Hello {
     public static void main(String[] args) {
         
     }
 }
 class EMployee{
     String name;
     char gender;
     int age;
     String job;
     double sal;
     // 職位 薪水
     public EMployee(String job,double sal) {
         this.job = job;
         this.sal = sal;
     }
     // 姓名 性別 年齡
     public EMployee(String name,char gender,int age) {
         this.name = name;
         this.gender = gender;
         this.age = age;
     }
     // 名字 性別 年齡 職位 薪水
     public EMployee(String job,double sal,String name,char gender,int age) {
         this(name,gender,age);
         this.job = job;
         this.sal = sal;
     }
 }

推薦使用構(gòu)造器注入

? Spring框架對(duì)Java開(kāi)發(fā)的重要性不言而喻,平時(shí)使用最多的就是其中的IOC,我們通過(guò)將組件交由Spring的IOC容器管理,將對(duì)象的依賴關(guān)系由Spring控制,避免硬編碼所造成的過(guò)度程序耦合。

前幾天的時(shí)候,朋友問(wèn)我為什么要使用構(gòu)造器的注入方式,后面抽時(shí)間了解了一下,下面就是筆者要討論的就是其注入方式。 

常見(jiàn)的三種注入方式

field注入

@Controller
public class FooController {
  @Autowired
  //@Inject
  private FooService fooService;
  
  //簡(jiǎn)單的使用例子,下同
  public List<Foo> listFoo() {
      return fooService.list();
  }
}

這種注入方式應(yīng)該是筆者目前為止開(kāi)發(fā)中見(jiàn)到的最常見(jiàn)的注入方式。原因很簡(jiǎn)單:

  • 注入方式非常簡(jiǎn)單:加入要注入的字段,附上@Autowired,即可完成。
  • 使得整體代碼簡(jiǎn)潔明了,看起來(lái)美觀大方。  

構(gòu)造器注入

@Controller
public class FooController {
  
  private final FooService fooService;
  
  @Autowired
  public FooController(FooService fooService) {
      this.fooService = fooService;
  }
  
  //使用方式上同,略
}

setter注入

@Controller
public class FooController {
  
  private FooService fooService;
  
  //使用方式上同,略
  @Autowired
  public void setFooService(FooService fooService) {
      this.fooService = fooService;
  }
}

構(gòu)造器注入的好處

  • 依賴不可變:其實(shí)說(shuō)的就是final關(guān)鍵字,這里不再多解釋了。不明白的園友可以回去看看Java語(yǔ)法。
  • 依賴不為空(省去了我們對(duì)其檢查):當(dāng)要實(shí)例化FooController的時(shí)候,由于自己實(shí)現(xiàn)了有參數(shù)的構(gòu)造函數(shù),所以不會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù),那么就需要Spring容器傳入所需要的參數(shù),所以就兩種情況:1、有該類型的參數(shù)->傳入,OK 。2:無(wú)該類型的參數(shù)->報(bào)錯(cuò)。所以保證不會(huì)為空,Spring總不至于傳一個(gè)null進(jìn)去吧 ??
  • 完全初始化的狀態(tài):這個(gè)可以跟上面的依賴不為空結(jié)合起來(lái),向構(gòu)造器傳參之前,要確保注入的內(nèi)容不為空,那么肯定要調(diào)用依賴組件的構(gòu)造方法完成實(shí)例化。而在Java類加載實(shí)例化的過(guò)程中,構(gòu)造方法是最后一步(之前如果有父類先初始化父類,然后自己的成員變量,最后才是構(gòu)造方法,這里不詳細(xì)展開(kāi)。)。所以返回來(lái)的都是初始化之后的狀態(tài)。
//承接上面field注入的代碼,假如客戶端代碼使用下面的調(diào)用(或者再Junit測(cè)試中使用)
//這里只是模擬一下,正常來(lái)說(shuō)我們只會(huì)暴露接口給客戶端,不會(huì)暴露實(shí)現(xiàn)。
FooController fooController = new FooController();
fooController.listFoo(); // -> NullPointerException

如果使用field注入,缺點(diǎn)顯而易見(jiàn),對(duì)于IOC容器以外的環(huán)境,除了使用反射來(lái)提供它需要的依賴之外,無(wú)法復(fù)用該實(shí)現(xiàn)類。而且將一直是個(gè)潛在的隱患,因?yàn)槟悴徽{(diào)用將一直無(wú)法發(fā)現(xiàn)NPE的存在。

還值得一提另外一點(diǎn)是:使用field注入可能會(huì)導(dǎo)致循環(huán)依賴,即A里面注入B,B里面又注入A:

public class A {
    @Autowired
    private B b;
}
 
public class B {
    @Autowired
    private A a;
}

如果使用構(gòu)造器注入,在spring項(xiàng)目啟動(dòng)的時(shí)候,就會(huì)拋出:

BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference?

從而提醒你避免循環(huán)依賴,如果是field注入的話,啟動(dòng)的時(shí)候不會(huì)報(bào)錯(cuò),在使用那個(gè)bean的時(shí)候才會(huì)報(bào)錯(cuò)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Eclipse 2020-06 漢化包安裝步驟詳解(附漢化包+安裝教程)

    Eclipse 2020-06 漢化包安裝步驟詳解(附漢化包+安裝教程)

    這篇文章主要介紹了Eclipse 2020-06 漢化包安裝步驟(附漢化包+安裝教程),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java程序執(zhí)行Cmd指令所遇問(wèn)題記錄及解決方案

    Java程序執(zhí)行Cmd指令所遇問(wèn)題記錄及解決方案

    這篇文章主要介紹了Java程序執(zhí)行Cmd指令所遇問(wèn)題記錄,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java?List一些常用方法完全攻略

    Java?List一些常用方法完全攻略

    List就是一個(gè)線性表,即n個(gè)具有相同類型元素的有限序列,在該序列上可以執(zhí)行增刪改查以及變量等操作,這篇文章主要介紹了Java List一些常用方法的相關(guān)資料,需要的朋友可以參考下
    2026-04-04
  • SpringBoot 中的 @Transactional 事務(wù)基本作用及注意事項(xiàng)示例詳解

    SpringBoot 中的 @Transactional 事務(wù)基本作用及注意事項(xiàng)示例詳解

    @Transactional是SpringBoot中聲明式事務(wù)管理的核心注解,通過(guò)注解簡(jiǎn)化事務(wù)控制,確保操作的原子性,支持異?;貪L、隔離級(jí)別和傳播行為配置,需注意代理模式、異常拋出及數(shù)據(jù)庫(kù)支持等條件,避免事務(wù)失效,本文介紹SpringBoot @Transactional事務(wù)作用,感興趣的朋友一起看看吧
    2025-09-09
  • java基面試礎(chǔ)知識(shí)詳解

    java基面試礎(chǔ)知識(shí)詳解

    這篇文章主要介紹了java基面試礎(chǔ)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Java中IO流概述

    Java中IO流概述

    大家好,本篇文章主要講的是Java中IO流概述,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • SpringMVC生成的驗(yàn)證碼圖片不顯示問(wèn)題及解決方法

    SpringMVC生成的驗(yàn)證碼圖片不顯示問(wèn)題及解決方法

    這篇文章主要介紹了SpringMVC生成的驗(yàn)證碼圖片不顯示問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java使用utf8格式保存文本文件的方法

    Java使用utf8格式保存文本文件的方法

    這篇文章主要介紹了Java使用utf8格式保存文本文件的方法,涉及Java針對(duì)字符流編碼操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-11-11
  • java實(shí)現(xiàn)停車場(chǎng)系統(tǒng)

    java實(shí)現(xiàn)停車場(chǎng)系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)停車場(chǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • Spring boot JPA實(shí)現(xiàn)分頁(yè)和枚舉轉(zhuǎn)換代碼示例

    Spring boot JPA實(shí)現(xiàn)分頁(yè)和枚舉轉(zhuǎn)換代碼示例

    這篇文章主要介紹了Spring boot JPA實(shí)現(xiàn)分頁(yè)和枚舉轉(zhuǎn)換代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論

新余市| 古浪县| 时尚| 兰西县| 醴陵市| 交城县| 巨鹿县| 许昌市| 滦平县| 渭源县| 亳州市| 中西区| 防城港市| 弥渡县| 温泉县| 哈巴河县| 内江市| 庆安县| 阳新县| 龙泉市| 唐河县| 广德县| 介休市| 蒙阴县| 大悟县| 简阳市| 泽州县| 连江县| 丰台区| 汝城县| 桃园市| 怀化市| 昆明市| 门头沟区| 南雄市| 前郭尔| 苍南县| 进贤县| 嘉禾县| 报价| 鹤峰县|