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

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

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

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

創(chuàng)建一個Employee類,屬性有(名字,性別,年齡,職位,薪水),提供3個構(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框架對Java開發(fā)的重要性不言而喻,平時(shí)使用最多的就是其中的IOC,我們通過將組件交由Spring的IOC容器管理,將對象的依賴關(guān)系由Spring控制,避免硬編碼所造成的過度程序耦合。

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

常見的三種注入方式

field注入

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

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

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

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

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

還值得一提另外一點(diǎn)是:使用field注入可能會導(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)目啟動的時(shí)候,就會拋出:

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

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

總結(jié)

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

相關(guān)文章

  • Java中的動態(tài)數(shù)組和棧Vector Stack使用區(qū)別介紹

    Java中的動態(tài)數(shù)組和棧Vector Stack使用區(qū)別介紹

    這篇文章主要為大家介紹了Java中的動態(tài)數(shù)組和棧Vector Stack使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • 四個Java必須知道的負(fù)載均衡算法分享

    四個Java必須知道的負(fù)載均衡算法分享

    我們在設(shè)計(jì)系統(tǒng)的時(shí)候,為了系統(tǒng)的高擴(kuò)展性,會創(chuàng)建無狀態(tài)的系統(tǒng)。但是,要使系統(tǒng)具有更好的可擴(kuò)展性,除了無狀態(tài)設(shè)計(jì)之外,還要考慮采用什么負(fù)載均衡算法,本文就帶領(lǐng)大家認(rèn)識以下常見的4種負(fù)載均衡算法
    2023-01-01
  • Spring Boot使用Druid進(jìn)行維度的統(tǒng)計(jì)和監(jiān)控

    Spring Boot使用Druid進(jìn)行維度的統(tǒng)計(jì)和監(jiān)控

    這篇文章主要介紹了Spring Boot使用Druid進(jìn)行維度的統(tǒng)計(jì)和監(jiān)控,非常不錯,具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-04-04
  • 關(guān)于mybatis-plus邏輯刪除無效的問題

    關(guān)于mybatis-plus邏輯刪除無效的問題

    這篇文章主要介紹了mybatis-plus邏輯刪除無效,文中給大家提到了配置過程及全部代碼,代碼簡單易懂,需要的朋友可以參考下
    2021-09-09
  • Java使用ExecutorService來停止線程服務(wù)

    Java使用ExecutorService來停止線程服務(wù)

    這篇文章主要介紹了Java使用ExecutorService來停止線程服務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的方法

    在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的方法

    這篇文章主要介紹了在IntelliJ IDEA中創(chuàng)建和運(yùn)行java/scala/spark程序的教程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper實(shí)例詳解

    SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper實(shí)例詳解

    這篇文章主要介紹了SpringBoot整合MyBatis逆向工程及 MyBatis通用Mapper實(shí)例詳解 ,需要的朋友可以參考下
    2017-09-09
  • Spring容器添加組件方式實(shí)現(xiàn)

    Spring容器添加組件方式實(shí)現(xiàn)

    這篇文章主要介紹了Spring容器添加組件方式實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • idea中database不顯示問題的解決

    idea中database不顯示問題的解決

    這篇文章主要介紹了idea中database不顯示問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • 詳解Spring boot Admin 使用eureka監(jiān)控服務(wù)

    詳解Spring boot Admin 使用eureka監(jiān)控服務(wù)

    本篇文章主要介紹了詳解Spring boot Admin 使用eureka監(jiān)控服務(wù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12

最新評論