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

Springboot中依賴注入的三種方式詳解

 更新時間:2023年09月13日 08:46:30   作者:五月天的尾巴  
這篇文章主要介紹了Springboot中依賴注入的三種方式詳解,Setter Injection需要依賴@Autowired注解,使用方式與Field Injection有所不同,Field Injection時@Autowired是用在成員變量上,需要的朋友可以參考下

Springboot依賴注入Bean的方式

一、Field 注入/屬性注入

@Autowired注解的一大使用場景就是Field Injection。

@Controller
public class UserController {
    @Autowired
    private UserService userService;
}

通過Java的反射機(jī)制實(shí)現(xiàn),所以private的成員也可以被注入具體的對象

優(yōu)點(diǎn)

  • 代碼少,簡潔明了。
  • 新增依賴十分方便,不需要修改原有代碼

缺點(diǎn)

  • 容易出現(xiàn)空指針異常。Field 注入允許構(gòu)建對象實(shí)例時依賴的對象為空,導(dǎo)致空指針異常不能在啟動時就爆出來,只能在用到它時才發(fā)現(xiàn)。
    空指針異常不是必現(xiàn)的,與bean的實(shí)例化順序有關(guān)。有時,把依賴的bean改個名字就會報空指針異常。
  • 會出現(xiàn)循環(huán)依賴的隱患。

二、set注入

Setter Injection需要依賴@Autowired注解,使用方式與Field Injection有所不同,F(xiàn)ield Injection時@Autowired是用在成員變量上,而Setter Injection的時候,@Autowired是用在成員變量的Setter函數(shù)上。

@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService){
        this.userService = userService;
    }
}

通過調(diào)用成員變量的set方法來注入想要使用的依賴對象。

優(yōu)點(diǎn)

  • 注入?yún)?shù)多的時候比較方便。構(gòu)造器注入?yún)?shù)太多了,顯得很笨重
  • 能讓類在之后重新配置或者重新注入。

缺點(diǎn)

  • 有一定風(fēng)險。set注入是后初始化其依賴對象,如果一個對象在沒有完全初始化就被外界使用是不安全的(尤其是在多線程場景下更加突出)。

三、構(gòu)造器注入

Constructor Injection是構(gòu)造器注入,是Springboot最為推薦的一種使用方式。

@Controller
public class UserController {
    private final UserService userService;
    public UserController(UserService userService){
        this.userService = userService;
    }
}

注意:

  • 不能提供無參構(gòu)造方法,否則Springboot默認(rèn)會加載無參的構(gòu)造方法,Bean實(shí)例對象會為null
  • Springboot官方建議使用final來修飾成員變量,然后通過構(gòu)造方法來進(jìn)行注入。原因:final修飾的成員變量是不能夠被修改的;不加final雖然也能注入Bean,但是若被其他人修改為null,可能會導(dǎo)致不必要的問題,所以最好是加final。

通過對象構(gòu)建的時候建立關(guān)系,這種方式對對象創(chuàng)建的順序會有要求,當(dāng)然Spring會為你搞定這樣的先后順序,除非你出現(xiàn)循環(huán)依賴,然后就會拋出異常。

Spring 4.x 的時候,Spring 官方在對比構(gòu)造器注入和 Setter 注入時,推薦使用構(gòu)造器注入方式:

優(yōu)點(diǎn)

  • 保證注入的組件不可變
  • 確保需要的依賴不為空
  • 解決循環(huán)依賴的問題(若有循環(huán)依賴會在項目啟動時拋錯)

能夠保證注入的組件不可變,并且確保需要的依賴不為空。此外,構(gòu)造器注入的依賴總是能夠在返回客戶端(組件)代碼的時候保證完全初始化的狀態(tài)。

若手工寫構(gòu)造方法覺得麻煩,也可以使用lombok中的@RequiredArgsConstructor

@RequiredArgsConstructor
public class VerifyController {
    private final UserService userService;
    private final StudentService studentService;
}

@RequiredArgsConstructor

@RequiredArgsConstructor 注解是針對標(biāo)有 @NonNull 注解的變量和 final 變量進(jìn)行參數(shù)的構(gòu)造方法。

到此這篇關(guān)于Springboot中依賴注入的三種方式詳解的文章就介紹到這了,更多相關(guān)Springboot依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Linux中Elasticsearch的安裝詳細(xì)步驟

    Linux中Elasticsearch的安裝詳細(xì)步驟

    這篇文章主要介紹了Linux中Elasticsearch的安裝詳細(xì)步驟,Elasticsearch(ES)是一種分布式、可擴(kuò)展的搜索和分析引擎,基于Lucene構(gòu)建,它支持實(shí)時數(shù)據(jù)處理、全文搜索、實(shí)時分析等多種功能,需要的朋友可以參考下
    2024-12-12
  • Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例

    Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例

    這篇文章主要介紹了Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例,幫助大家更好的理解和學(xué)習(xí)使用Spring Cloud,感興趣的朋友可以了解下
    2021-03-03
  • 詳解Spring Security如何在權(quán)限中使用通配符

    詳解Spring Security如何在權(quán)限中使用通配符

    小伙伴們知道,在Shiro中,默認(rèn)是支持權(quán)限通配符的。現(xiàn)在給用戶授權(quán)的時候,可以一個權(quán)限一個權(quán)限的配置,也可以直接用通配符。本文將介紹Spring Security如何在權(quán)限中使用通配符,需要的可以參考一下
    2022-06-06
  • Spring使用注解進(jìn)行引用類型的自動裝配逐步分析

    Spring使用注解進(jìn)行引用類型的自動裝配逐步分析

    自動裝配是springboot的核心,一般提到自動裝配就會和springboot聯(lián)系在一起。實(shí)際上Spring Framework早就實(shí)現(xiàn)了這個功能。Spring Boot只是在其基礎(chǔ)上,通過SPI的方式,做了進(jìn)一步優(yōu)化
    2023-03-03
  • 在Mybatis中association標(biāo)簽多層嵌套的問題

    在Mybatis中association標(biāo)簽多層嵌套的問題

    這篇文章主要介紹了在Mybatis中association標(biāo)簽多層嵌套的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 淺談JVM垃圾回收之哪些對象可以被回收

    淺談JVM垃圾回收之哪些對象可以被回收

    這篇文章主要介紹了JVM垃圾回收之哪些對象可以被回收,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊并訪問功能

    SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊并訪問功能

    zookeeper和eureka一樣,是用于充當(dāng)服務(wù)注冊功能服務(wù)器的一個springcloud插件,這篇文章主要介紹了SpringCloud集成zookeeper實(shí)現(xiàn)服務(wù)注冊并訪問,需要的朋友可以參考下
    2022-06-06
  • 如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實(shí)體類

    如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實(shí)體類

    今天給大家?guī)淼闹R是關(guān)于Java的,文章圍繞著如何讓java只根據(jù)數(shù)據(jù)庫表名自動生成實(shí)體類展開,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • Spring Boot緩存問題分析及解決方案

    Spring Boot緩存問題分析及解決方案

    SpringBoot提供緩存支持,提升應(yīng)用性能,但可能出現(xiàn)緩存不一致、緩存穿透、緩存擊穿等問題,分析了緩存基本概念、SpringBoot緩存支持、常見緩存問題及解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 一篇文章帶你入門Java方法詳解

    一篇文章帶你入門Java方法詳解

    這篇文章主要介紹了簡單了解Java方法的定義和使用實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2021-08-08

最新評論

图木舒克市| 绵阳市| 白朗县| 成武县| 托里县| 铜陵市| 嘉义市| 台前县| 炉霍县| 温州市| 淳安县| 民县| 绥滨县| 招远市| 开平市| 保康县| 襄垣县| 张家界市| 奉新县| 永吉县| 佛教| 湘潭市| 西吉县| 礼泉县| 澎湖县| 莲花县| 巴林左旗| 天水市| 高密市| 沁源县| 密山市| 龙南县| 博兴县| 遂川县| 秀山| 禹州市| 大渡口区| 遂溪县| 镇巴县| 斗六市| 三门县|