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

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

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

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

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

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

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

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

1.0,前期準(zhǔn)備

1,準(zhǔn)備Service類

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

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

1.1,屬性注入

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

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

2,啟動(dòng)類實(shí)現(xiàn)代碼:

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

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

1.2,Setter注入

1,方式對(duì)應(yīng)實(shí)現(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,啟動(dòng)類實(shí)現(xiàn)代碼:

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

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

image-20230710103836173

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

1,方式對(duì)應(yīng)實(shí)現(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,啟動(dòng)類實(shí)現(xiàn)代碼:

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

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

image-20230710103841006

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

2.1,屬性注入

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

image-20230710104809219

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

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

3,方式缺點(diǎn):

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

2.2,Setter注入

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

image-20230710105024612

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

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

3,方式缺點(diǎn):

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

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

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

image-20230710105124339

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

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

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

3,方式缺點(diǎn):

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

三,對(duì)象注入中的問題

3.1,@Autowired 和 @Resource

在進(jìn)行類注入時(shí),除了可以使用@Autowired注解之外,我們還可以使用@Resource注解進(jìn)行注入。

image-20230710111811566

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

來源不同:

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

注入方式不同:

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

支持的類型不同:

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

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

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

3.2,同類型多個(gè) @Bean 報(bào)錯(cuò)

當(dāng)出現(xiàn)多個(gè) Bean 返回同?對(duì)象類型時(shí),程序會(huì)報(bào)錯(cuò)。解決同一個(gè)類型,多個(gè)bean的解決方案有以下兩個(gè):

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

image-20230710113255725

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

image-20230710113416657

核心總結(jié)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3,同類型多個(gè) @Bean 報(bào)錯(cuò)的解決方案有哪些?

解決同一個(gè)類型 @Bean 報(bào)錯(cuò)的解決方案有以下兩個(gè):

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

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

相關(guān)文章

  • Java8的default和static關(guān)鍵字的使用講解

    Java8的default和static關(guān)鍵字的使用講解

    今天小編就為大家分享一篇關(guān)于Java8的default和static關(guān)鍵字的使用講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • SpringBoot中調(diào)用通用URL的實(shí)現(xiàn)

    SpringBoot中調(diào)用通用URL的實(shí)現(xiàn)

    在 Spring Boot 應(yīng)用程序中,有時(shí)候我們需要調(diào)用一些通用的 URL 接口,本文主要介紹了SpringBoot中調(diào)用通用URL的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • IDEA中設(shè)置代碼自動(dòng)提示為Alt+/的具體做法

    IDEA中設(shè)置代碼自動(dòng)提示為Alt+/的具體做法

    很多公司都強(qiáng)制性要求使用Intellij?IDEA,其實(shí)Intellij?IDEA也確實(shí)很好用,但是一下子從Eclipse跳轉(zhuǎn)到Intellij?IDEA轉(zhuǎn)也是需要一段時(shí)間的,為了迎合之前的習(xí)慣,就需要在Intellij?IDEA中改變一些設(shè)置,如代碼自動(dòng)生成,本文給大家分享設(shè)置方法,感興趣的朋友一起看看吧
    2023-01-01
  • Mybatis防止sql注入的實(shí)例

    Mybatis防止sql注入的實(shí)例

    本文通過實(shí)例給大家介紹了Mybatis防止sql注入的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Java網(wǎng)絡(luò)編程之基于TCP協(xié)議

    Java網(wǎng)絡(luò)編程之基于TCP協(xié)議

    本文主要將Java基于TCP的網(wǎng)絡(luò)編程主要分解成5個(gè)功能:功能分解1:單向通信功能分解,2:雙向通信功能分解,3:對(duì)象流傳送功能分解,4:加入完整的處理異常方式功能分解,5:多線程接收用戶請(qǐng)求,需要的朋友可以參考下
    2021-05-05
  • 詳解Java中接口的定義與實(shí)例代碼

    詳解Java中接口的定義與實(shí)例代碼

    這篇文章主要介紹了詳解Java中接口的定義與實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場景

    淺談Java中BIO、NIO和AIO的區(qū)別和應(yīng)用場景

    這篇文章主要介紹了Java中BIO、NIO和AIO的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • MyBatis中的模糊查詢語句

    MyBatis中的模糊查詢語句

    這篇文章主要介紹了MyBatis中的模糊查詢語句的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • java中如何獲取時(shí)間戳的方法實(shí)例

    java中如何獲取時(shí)間戳的方法實(shí)例

    時(shí)間戳通常是一個(gè)字符序列,唯一地標(biāo)識(shí)某一刻的時(shí)間,所以下面這篇文章主要給大家介紹了關(guān)于java中如何獲取時(shí)間戳的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Java 函數(shù)編程詳細(xì)介紹

    Java 函數(shù)編程詳細(xì)介紹

    這篇文章主要介紹了Java函數(shù)式編程,lambda表達(dá)式可以被認(rèn)為是一個(gè)匿名函數(shù),可以在函數(shù)接口的上下文中使用。函數(shù)接口是只指定一個(gè)抽象方法的接口,下面來看文章的詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-11-11

最新評(píng)論