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

spring中對象注入的三種實現(xiàn)方式

 更新時間:2023年07月19日 09:23:16   作者:小楊MiManchi  
本文主要介紹了spring中對象注入的三種實現(xiàn)方式,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

本文主要介紹了對象注入的實現(xiàn),分享給大家,具體如下:

一,實現(xiàn)方式的使用

對象注入也可被稱為對象裝配,是把Bean對象獲取出來放到某個類中。

對象注入的實現(xiàn)方式有3種,分別為屬性注入,Setter注入和構(gòu)造方法注入。

為了更好地理解對象注入的實現(xiàn)方式,搞個實例來具體說明:

1.0,前期準(zhǔn)備

1,準(zhǔn)備Service類

@Service
public class StudentService {
    public void sayHi(){
        System.out.println("do student service sayHi()");
    }
}

示例問題:將 Service 類注入到 Controller 類中,對象注入實現(xiàn):

1.1,屬性注入

1,方式對應(yīng)實現(xiàn)的Controller 類代碼:

@Controller
public class StudentController {
    //注入方式:屬性注入
    @Autowired
    private StudentService studentService;
    public void sayHi(){
        System.out.println("do student controller sayHi()");
        studentService.sayHi();
    }
}

2,啟動類實現(xiàn)代碼:

public class App {
    public static void main(String[] args) {
        //1,獲取Spring上下文
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //2,得到Bean對象
        StudentController studentController =
                applicationContext.getBean("studentController",StudentController.class);
        //3,使用Bean對象
        studentController.sayHi();
    }
}

3,啟動類執(zhí)行結(jié)果:

1.2,Setter注入

1,方式對應(yīng)實現(xiàn)的Controller 類代碼:

@Controller
public class StudentController {
    private StudentService studentService;
    @Autowired
    public void setStudentService(StudentService studentService) {
        this.studentService = studentService;
    }
    public void sayHi(){
        System.out.println("do student controller sayHi()");
        studentService.sayHi();
    }
}

2,啟動類實現(xiàn)代碼:

public class App {
    public static void main(String[] args) {
        //1,獲取Spring上下文
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //2,得到Bean對象
        StudentController studentController =
                applicationContext.getBean("studentController",StudentController.class);
        //3,使用Bean對象
        studentController.sayHi();
    }
}

3,啟動類執(zhí)行結(jié)果:

image-20230710103836173

1.3,構(gòu)造方法注入

1,方式對應(yīng)實現(xiàn)的Controller 類代碼:

@Controller
public class StudentController {
    private StudentService studentService;
    @Autowired
    public StudentController(StudentService studentService) {
        this.studentService = studentService;
    }
    public void sayHi(){
        System.out.println("do student controller sayHi()");
        studentService.sayHi();
    }
}

2,啟動類實現(xiàn)代碼:

public class App {
    public static void main(String[] args) {
        //1,獲取Spring上下文
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //2,得到Bean對象
        StudentController studentController =
                applicationContext.getBean("studentController",StudentController.class);
        //3,使用Bean對象
        studentController.sayHi();
    }
}

3,啟動類執(zhí)行結(jié)果:

image-20230710103841006

二,方式的優(yōu)缺點分析

2.1,屬性注入

1,方式實現(xiàn)代碼:

image-20230710104809219

2,方式優(yōu)點:

實現(xiàn)簡單,易于理解和維護

3,方式缺點:

  • 不能注入不可變對象【final 修飾的變量】
  • 通用性差,只適用于IoC容器,在非IoC框架中無效
  • 更容易違背單一設(shè)計原則

2.2,Setter注入

1,方式實現(xiàn)代碼:

image-20230710105024612

2,方式優(yōu)點:

符合單一設(shè)計原則【每個方法只傳遞一個對象】

3,方式缺點:

  • 不能注入不可變對象【final 修飾的變量】
  • 使用Setter注入的對象可能被修改

2.3,構(gòu)造方法注入

1,方式實現(xiàn)代碼:

image-20230710105124339

注意:如果只有一個構(gòu)造方法,那么 @Autowired 注解可以省略。

2,方式優(yōu)點:

  • 可以注入不可變對象【final 修飾的變量】
  • 注入對象不會被改變【構(gòu)造方法只執(zhí)行一次】
  • 注入對象會完全被初始化
  • 通用性更好,可在IoC容器中使用,也可在非IoC中使用

3,方式缺點:

  • 不符合單一設(shè)計原則【每個方法可傳遞多個對象】

三,對象注入中的問題

3.1,@Autowired 和 @Resource

在進行類注入時,除了可以使用@Autowired注解之外,我們還可以使用@Resource注解進行注入。

image-20230710111811566

@Autowired@Resource 都是在 Spring 框架中用于注入依賴的注解,它們有以下區(qū)別:

來源不同:

  • @Autowired 是 Spring 框架提供的注解,通過類型進行依賴注入。
  • @Resource 是 JavaEE 定義的注解,通過名稱進行依賴注入。

注入方式不同:

  • @Autowired 默認(rèn)按照類型匹配的方式進行注入,如果存在多個相同類型的實例,可以結(jié)合 @Qualifier 注解來指定具體實例。
  • @Resource 默認(rèn)按照名稱匹配的方式進行注入,它支持使用 nametype 屬性來指定名稱或類型進行匹配。

支持的類型不同:

  • @Autowired 支持通過構(gòu)造方法注入、屬性注入、Setter 注入的方式實現(xiàn)依賴注入。
  • @Resource 支持通過屬性注入、Setter 注入的方式實現(xiàn)依賴注入,不支持構(gòu)造方法注入。

應(yīng)用范圍不同:

  • @Autowired 主要用于 Spring 框架中的組件(如 Spring Bean)的依賴注入。
  • @Resource 是 JavaEE 規(guī)范中的注解,它可以用于依賴注入和資源的獲取,對于不依賴于 Spring 框架的應(yīng)用也可以使用。

3.2,同類型多個 @Bean 報錯

當(dāng)出現(xiàn)多個 Bean 返回同?對象類型時,程序會報錯。解決同一個類型,多個bean的解決方案有以下兩個:

1,使用 @Resource(name="")

image-20230710113255725

2,搭配 @Autowired 使用 @Qualifierr(value = "")

image-20230710113416657

核心總結(jié)

1,三種對象注入的實現(xiàn)方式以及優(yōu)缺點?

屬性注入,Setter注入和構(gòu)造方法注入是在依賴注入中常用的三種方式,它們各有優(yōu)缺點:

1,屬性注入方式:其實現(xiàn)簡單,易于理解和維護,但是其不能注入不可變對象,只適用于IoC容器,并且違反單一設(shè)計原則的概率大。

2,Setter注入方式:其符合單一設(shè)計原則,但是其不能注入不可變對象,并且使用Setter注入的對象可能被修改。

3,構(gòu)造方法注入方式:其可以注入不可變對象,注入的對象不能被改變,保證注入對象完全被初始化,并且具有通用性,但是其不符合單一設(shè)計原則。

注意:在上述的三種對象注入的實現(xiàn)方式中,構(gòu)造方法注入是Spring推薦的注入方式。

思考:為什么構(gòu)造方法可以注入不可變變量,而屬性注入和Setter注入?yún)s不行呢?

解答:在 Java 中,被final修飾的對象,要么直接進行賦值,要么就在構(gòu)造方法中進行賦值,兩種情況必須滿足一個,否則方式報錯。

2,@Autowired 和 @Resource 注入注解的區(qū)別?

@Autowired@Resource 都是在 Spring 框架中用于注入依賴的注解,它們有以下區(qū)別:

1,來源不同:@Autowired 是 Spring 框架提供的注解,而@Resource 是 JavaEE 定義的注解。

2,注入方式不同:@Autowired 默認(rèn)按照類型匹配的方式進行注入,而@Resource 默認(rèn)按照名稱匹配的方式進行注入。

3,支持的類型不同:@Resource 支持通過屬性注入、Setter 注入的方式實現(xiàn)依賴注入,不支持構(gòu)造方法注入,而@Autowired 支持。

4,應(yīng)用范圍不同:@Autowired 主要用于 Spring 框架中的組件的依賴注入,而@Resource對于不依賴于 Spring 框架的應(yīng)用也可使用。

3,同類型多個 @Bean 報錯的解決方案有哪些?

解決同一個類型 @Bean 報錯的解決方案有以下兩個:

使用 @Resource(name="")使用 @Qualifierr(value = "") 【搭配@Autowired使用】 結(jié)語

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

相關(guān)文章

  • Spring boot集成swagger2生成接口文檔的全過程

    Spring boot集成swagger2生成接口文檔的全過程

    這篇文章主要給大家介紹了關(guān)于Spring boot集成swagger2生成接口文檔的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 解析Spring Cloud Bus消息總線

    解析Spring Cloud Bus消息總線

    這篇文章主要介紹了Spring Cloud Bus消息總線的介紹及使用,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • Java并發(fā)系列之ConcurrentHashMap源碼分析

    Java并發(fā)系列之ConcurrentHashMap源碼分析

    這篇文章主要為大家詳細分析了Java并發(fā)系列之ConcurrentHashMap源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源及使用方式

    Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源及使用

    dynamic-datasource-spring-boot-starter是一個基于springboot的快速集成多數(shù)據(jù)源的啟動器,它跟mybatis-plus是一個生態(tài)圈里的,很容易集成mybatis-plus,本文介紹Mybatis plus Dynamic Datasource 動態(tài)數(shù)據(jù)源的相關(guān)知識,感興趣的朋友一起看看吧
    2025-09-09
  • java關(guān)鍵字abstract(抽象)實例詳解

    java關(guān)鍵字abstract(抽象)實例詳解

    在Java中,抽象類是不能實例化的類,它通常作為其他子類的父類存在,并提供了一種繼承的框架,抽象類中可以包含抽象方法,這些方法沒有具體的實現(xiàn),必須由子類來提供,本文給大家介紹java關(guān)鍵字abstract(抽象)實例詳解,感興趣的朋友跟隨小編一起看看吧
    2024-10-10
  • spring Boot查詢數(shù)據(jù)分頁顯示的方法實例

    spring Boot查詢數(shù)據(jù)分頁顯示的方法實例

    這篇文章主要給大家介紹了關(guān)于spring Boot查詢數(shù)據(jù)分頁顯示的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java并發(fā)之synchronized實現(xiàn)原理深入理解

    Java并發(fā)之synchronized實現(xiàn)原理深入理解

    這篇文章主要介紹了Java中synchronized實現(xiàn)原理詳解,涉及synchronized實現(xiàn)同步的基礎(chǔ),Java對象頭,Monitor,Mark Word,鎖優(yōu)化,自旋鎖等相關(guān)內(nèi)容,具有一定借鑒價值,需要的朋友可以參考下
    2021-08-08
  • Spring?MVC內(nèi)置過濾器功能示例詳解

    Spring?MVC內(nèi)置過濾器功能示例詳解

    這篇文章主要為大家介紹了Spring?MVC內(nèi)置過濾器使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java集合之Disruptor操作示例

    Java集合之Disruptor操作示例

    這篇文章主要為大家介紹了Java集合之Disruptor操作示例介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • SpringBoot聲明式事務(wù)的簡單運用說明

    SpringBoot聲明式事務(wù)的簡單運用說明

    這篇文章主要介紹了SpringBoot聲明式事務(wù)的簡單運用說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

余江县| 滕州市| 亳州市| 荆州市| 建始县| 武安市| 景德镇市| 池州市| 盐池县| 竹山县| 平果县| 宝坻区| 林甸县| 中江县| 博湖县| 黄陵县| 镇巴县| 巴马| 通道| 五家渠市| 颍上县| 松江区| 文水县| 山东| 当雄县| 泌阳县| 安吉县| 拜泉县| 张家川| 新邵县| 太仓市| 隆德县| 广丰县| 吕梁市| 兴国县| 木里| 昌乐县| 灵石县| 清新县| 金川县| 扎鲁特旗|