亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

spring中對象注入的三種實現方式

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

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

一,實現方式的使用

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

對象注入的實現方式有3種,分別為屬性注入,Setter注入和構造方法注入。

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

1.0,前期準備

1,準備Service類

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

示例問題:將 Service 類注入到 Controller 類中,對象注入實現:

1.1,屬性注入

1,方式對應實現的Controller 類代碼:

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

2,啟動類實現代碼:

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í)行結果:

1.2,Setter注入

1,方式對應實現的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,啟動類實現代碼:

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í)行結果:

image-20230710103836173

1.3,構造方法注入

1,方式對應實現的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,啟動類實現代碼:

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í)行結果:

image-20230710103841006

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

2.1,屬性注入

1,方式實現代碼:

image-20230710104809219

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

實現簡單,易于理解和維護

3,方式缺點:

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

2.2,Setter注入

1,方式實現代碼:

image-20230710105024612

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

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

3,方式缺點:

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

2.3,構造方法注入

1,方式實現代碼:

image-20230710105124339

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

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

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

3,方式缺點:

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

三,對象注入中的問題

3.1,@Autowired 和 @Resource

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

image-20230710111811566

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

來源不同:

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

注入方式不同:

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

支持的類型不同:

  • @Autowired 支持通過構造方法注入、屬性注入、Setter 注入的方式實現依賴注入。
  • @Resource 支持通過屬性注入、Setter 注入的方式實現依賴注入,不支持構造方法注入。

應用范圍不同:

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

3.2,同類型多個 @Bean 報錯

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

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

image-20230710113255725

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

image-20230710113416657

核心總結

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

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

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

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

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

注意:在上述的三種對象注入的實現方式中,構造方法注入是Spring推薦的注入方式。

思考:為什么構造方法可以注入不可變變量,而屬性注入和Setter注入卻不行呢?

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

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

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

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

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

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

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

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

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

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

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

相關文章

  • Java8的default和static關鍵字的使用講解

    Java8的default和static關鍵字的使用講解

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

    SpringBoot中調用通用URL的實現

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

    IDEA中設置代碼自動提示為Alt+/的具體做法

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

    Mybatis防止sql注入的實例

    本文通過實例給大家介紹了Mybatis防止sql注入的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-06-06
  • Java網絡編程之基于TCP協議

    Java網絡編程之基于TCP協議

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

    詳解Java中接口的定義與實例代碼

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

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

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

    MyBatis中的模糊查詢語句

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

    java中如何獲取時間戳的方法實例

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

    Java 函數編程詳細介紹

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

最新評論