Spring(三)容器-注入

一 自動注入@Autowire

代碼實現:

package org.example.spring01.service;import org.springframework.stereotype.Service;@Service
public class UserService {}
package org.example.spring01.controller;import lombok.Data;
import lombok.ToString;
import org.example.spring01.bean.Person;
import org.example.spring01.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;import java.util.List;
import java.util.Map;@ToString
@Data
@Controller
public class UserController {/*** 自動注入 原理:Spring調用容器的getBean方法* @Autowired* 只有且只找到一個,直接注入,名字無所謂* 如果找到多個在按照名稱去找,變量名就是名字*/@AutowiredUserService userService;@AutowiredList<Person> personList;@AutowiredMap<String,Person> personMap;}
package org.example.spring01;import org.example.spring01.controller.UserController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class Spring01Application {public static void main(String[] args) {// 啟動springboot應用ConfigurableApplicationContext ioc = SpringApplication.run(Spring01Application.class, args);System.out.println("run = " + ioc);UserController bean = ioc.getBean(UserController.class);System.out.println("bean = " + bean);}
}

默認首選/指定Bean@Primary @Qualifier

1 概述:

  • @Primary“默認選我”,簡化多數場景的依賴注入。

  • @Qualifier“點名要誰”,精準控制依賴的選擇。

2 當某個 Bean 被標記為?@Primary,Spring 的依賴注入規則變為:

  1. 優先選擇?@Primary?的 Bean,無論字段名如何變化。

  2. 忽略屬性名匹配,直接注入?@Primary?標記的 Bean。

3 在沒有?@Primary?時,Spring 按以下順序解決依賴:

  1. 按類型匹配:尋找與字段類型一致的 Bean。

  2. 按名稱匹配:如果有多個同類型 Bean,嘗試將字段名與 Bean 的名稱(ID)匹配。

@Primary標記一個Bean,然后在注入時用@Autowired,這時候會自動選擇@Primary的;或者當有多個Bean時,用@Qualifier指定名稱來注入。

當同時存在?@Primary?和?@Qualifier?時,@Qualifier?的優先級更高:

代碼實現:

    // @Primary默認組件,不說明Person具體就是這個@Primary@Bean("LiSi")public Person lisi() {Person person = new Person();person.setAge(18);person.setGender("男");person.setName("李四");return person;}

代碼實現:

package org.example.spring01.service;import lombok.Data;
import org.example.spring01.bean.Person;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;@Data                // Lombok 注解,自動生成 getter/setter/toString 等方法
@Service             // Spring 注解,標記為服務層 Bean
public class UserService {//如果容器中這種組件有多個,則使用@Qualifier注解精確指定注入的組件名@Qualifier("ZhangSan")  // 指定注入名為 "ZhangSan" 的 Bean@Autowired               // 自動注入依賴Person person;           // 依賴的 Person 對象
}

三 自動注入@Resource

在選擇使用哪一個注解時,可以根據項目的具體需求和個人偏好來決定。在許多情況下,這兩種注解可以互換使用,特別是在只有一個符合條件的bean的情況下。

使用場景:

  • 如果項目完全基于Spring框架,那么@Autowired可能是更自然的選擇;
  • 而如果是在Java EE環境中,或者你更傾向于通過名稱來引用bean,那么@Resource可能更適合。

參數

  • @Autowired 支持一個 required 參數,默認值為 true。設置為 false 時,表示即使沒有找到對應的bean也不會報錯。
  • @Resource 支持 name 和 type 屬性,可以明確指定要注入的bean的名稱和類型。

注入方式

  • @Autowired 支持構造器注入、設值方法注入以及字段注入。
  • @Resource 主要用于字段注入和設值方法注入,不直接支持構造器注入。

四 構造器注入

在 Spring 框架中,構造器自動注入(Constructor Injection)?是一種通過類的構造方法(Constructor)自動注入依賴項的方式。它不僅是依賴注入(DI)的核心模式之一,更是 Spring 官方推薦的最佳實踐。以下是其核心概念、優勢及使用場景的詳細解析:

1.?什么是構造器注入?

  • 定義:通過類的構造方法參數傳遞依賴項,由 Spring 容器自動將匹配的 Bean 注入到參數中。

  • 自動注入:從 Spring 4.3 開始,如果類只有一個構造方法,@Autowired?注解可以省略,Spring 會默認使用該構造方法注入依賴。

@Service
public class UserService {private final UserRepository userRepository;private final EmailService emailService;// Spring 自動注入依賴(無需 @Autowired)public UserService(UserRepository userRepository, EmailService emailService) {this.userRepository = userRepository;this.emailService = emailService;}
}

2、構造器注入的優勢

1.?依賴不可變性

  • final?字段:依賴項通過構造方法賦值后,可以聲明為?final,確保對象初始化后不可變。

  • 線程安全:避免依賴在運行時被意外修改,提升代碼健壯性。

2.?明確依賴關系

  • 強制依賴:構造方法參數明確聲明了類的所有必需依賴,避免依賴缺失。

  • 啟動時檢查:如果 Spring 容器中缺少某個依賴,應用會在啟動時直接報錯(而非運行時才暴露問題)。

3.?避免循環依賴

  • 設計約束:如果兩個類通過構造器注入相互依賴,Spring 會直接拋出?BeanCurrentlyInCreationException,迫使開發者重構代碼,解決循環依賴問題。

4.?更好的測試性

  • 無需容器:在單元測試中,可以直接通過構造方法傳入 Mock 對象,無需依賴 Spring 容器或反射。

  • 代碼透明:依賴關系一目了然,便于理解類的職責。


3、使用場景

1.?強依賴場景

  • 類的核心功能依賴某個組件(如數據庫訪問層?UserRepository)。

  • 示例:服務類、控制器、數據訪問對象(DAO)。

2.?需要不可變對象的場景

  • 配置類、DTO(數據傳輸對象)、工具類等,確保依賴不會被修改。

3.?Spring Boot 項目

  • Spring Boot 強烈推薦構造器注入,尤其是在結合 Lombok 的?@RequiredArgsConstructor?時,可以大幅簡化代碼。


4、實現方式

1.?隱式自動注入(Spring 4.3+)

  • 如果類只有一個構造方法,Spring 會自動選擇它進行注入,無需?@Autowired

@Service
public class PaymentService {private final PaymentGateway paymentGateway;// 無需 @Autowiredpublic PaymentService(PaymentGateway paymentGateway) {this.paymentGateway = paymentGateway;}
}

2.?顯式指定構造方法

  • 如果類有多個構造方法,需用?@Autowired?指定使用哪一個。

@Service
public class OrderService {private final InventoryService inventoryService;private final Logger logger;@Autowired // 顯式標記要使用的構造方法public OrderService(InventoryService inventoryService) {this(inventoryService, LoggerFactory.getLogger(OrderService.class));}// 輔助構造方法public OrderService(InventoryService inventoryService, Logger logger) {this.inventoryService = inventoryService;this.logger = logger;}
}

3.?結合 Lombok 簡化代碼

  • 使用?@RequiredArgsConstructor?自動生成包含?final?字段的構造方法。

@Service
@RequiredArgsConstructor // 自動生成構造方法
public class NotificationService {private final EmailService emailService;private final SmsService smsService;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/71328.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71328.shtml
英文地址,請注明出處:http://en.pswp.cn/web/71328.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mac上最好的Python開發環境之Anaconda+Pycharm

為了運行修改 label-studio項目源碼&#xff0c;又不想在windows上運行&#xff0c;便在mac上開始安裝&#xff0c;開始使用poetry安裝&#xff0c;各種報錯&#xff0c;不是zip包解壓不了&#xff0c;就是numpy編譯報錯&#xff0c;pipy.org訪問出錯。最后使用anaconda成功啟動…

IDEA 接入 Deepseek

在本篇文章中&#xff0c;我們將詳細介紹如何在 JetBrains IDEA 中使用 Continue 插件接入 DeepSeek&#xff0c;讓你的 AI 編程助手更智能&#xff0c;提高開發效率。 一、前置準備 在開始之前&#xff0c;請確保你已經具備以下條件&#xff1a; 安裝了 JetBrains IDEA&…

前綴和矩陣

前綴和矩陣&#xff08;Prefix Sum Matrix&#xff09;是一種預處理技術&#xff0c;用于快速計算二維矩陣中任意子矩陣的元素和。其核心思想是通過提前計算并存儲每個位置左上角所有元素的和&#xff0c;將子矩陣和的查詢時間從暴力計算的 (O(mn)) 優化到 (O(1))。以下是構建前…

系統架構評估中的重要概念

(1)敏感點(Sensitivity Point) 和權衡點 (Tradeoff Point)。敏感點和權衡點是關鍵的架構 決策。敏感點是一個或多個構件(和/或構件之間的關系)的特性。研究敏感點可使設計人員 或分析員明確在搞清楚如何實現質量目標時應注意什么。權衡點是影響多個質量屬性的特性&#xff0c; …

SSL證書和HTTPS:全面解析它們的功能與重要性

每當我們在互聯網上輸入個人信息、進行在線交易時&#xff0c;背后是否有一個安全的保障&#xff1f;這時&#xff0c;SSL證書和HTTPS便扮演了至關重要的角色。本文將全面分析SSL證書和HTTPS的含義、功能、重要性以及它們在網絡安全中的作用。 一、SSL證書的定義與基本概念 S…

基于微信小程序的停車場管理系統的設計與實現

第1章 緒論 1.1 課題背景 隨著移動互聯形式的不斷發展&#xff0c;各行各業都在摸索移動互聯對本行業的改變&#xff0c;不斷的嘗試開發出適合于本行業或者本公司的APP。但是這樣一來用戶的手機上就需要安裝各種軟件&#xff0c;但是APP作為一個只為某個公司服務的一個軟件&a…

寶塔找不到php擴展swoole,服務器編譯安裝

1. 在php7.4中安裝swoole&#xff0c;但找不到這個擴展安裝 2. 服務器下載源碼解壓安裝 http://pecl.php.net/package/swoole 下載4.8.0版本 解壓到/www/server/php/74/下 3. 發現報錯問題&#xff1b; 更新一下依賴 yum update yum -y install gcc gcc-c autoconf libjpe…

大數據測試總結

總結測試要點&#xff1a; 參考產品文檔&#xff0c;技術文檔梳理以下內容 需求來源 業務方應用場景 數據源&#xff0c;數據格轉&#xff0c;數據產出&#xff0c;數據呈現方式&#xff08;數據消亡史&#xff09;&#xff0c;數據量級&#xff08;增量&#xff0c;全量&am…

React封裝通用Table組件,支持搜索(多條件)、篩選、自動序號、數據量統計等功能。未采用二次封裝調整靈活,包含使用文檔

封裝通用組件 一、封裝思想二、react代碼三、css代碼四、實現效果五、使用文檔 BasicTableModal 表格模態框組件1.組件簡介2.功能特點3.使用方法基礎用法寬度控制示例帶篩選功能搜索功能示例自定義單元格渲染 4.API 說明PropsColumn 配置項Filter 配置項 5.注意事項 一、封裝思…

React 中 useState 的 基礎使用

概念&#xff1a;useState 是一個React Hook&#xff08;函數&#xff09;&#xff0c;它允許我們向組件添加狀態變量&#xff0c;從而影響組件的渲染結果。 本質&#xff1a;和普通JS變量不同的是&#xff0c;狀態變量一旦發生變化&#xff0c;組件的視圖UI也會跟著變化&…

Html5學習教程,從入門到精通,HTML `<div>` 和 `<span>` 標簽:語法知識點與案例代碼(12)

HTML <div> 和 <span> 標簽&#xff1a;語法知識點與案例代碼 一、語法知識點 1. <div> 標簽 定義: <div> 是一個塊級元素&#xff0c;用于將文檔內容劃分為獨立的、可樣式化的部分。它本身沒有特定的語義&#xff0c;主要用于布局和分組。特點: 塊…

Hbase偽分布安裝教程,詳細版

注意Hbase版本與Hadoop版本的兼容&#xff0c;還有與JDK版本的兼容 本次用到的Hbase為2.4.6版本&#xff0c;Hadoop為3.1.3版本&#xff0c;JDK為JDK8 打開下面的網址查看兼容問題 Apache HBase Reference Guidehttps://hbase.apache.org/book.html#configuration 點擊基礎先…

Python項目】基于Python的圖像去霧算法研究和系統實現

Python項目】基于Python的圖像去霧算法研究和系統實現 技術簡介&#xff1a;采用Python技術、MYSQL數據庫等實現。 系統簡介&#xff1a;圖像去霧系統主要是基于暗通道先驗和逆深度估計技術的去霧算法&#xff0c;系統功能模塊分為&#xff08;1&#xff09;圖像上傳模塊&…

Stable Diffusion Prompt編寫規范詳解

Stable Diffusion Prompt編寫規范詳解 一、語法結構規范 &#xff08;一&#xff09;基礎模板框架 [質量強化] [主體特征] [環境氛圍] [風格控制] [鏡頭參數]質量強化&#xff1a;best quality, ultra detailed, 8k resolution?主體特征&#xff1a;(1girl:1.3), long …

勿以危小而為之勿以避率而不為

《故事匯之&#xff1a;所見/所聞/所歷/所想》&#xff1a;《公園散步與小雨遇記》&#xff08;二&#xff09; 就差一點到山頂了&#xff0c;路上碰到一阿姨&#xff0c;她說等會兒要下大雨了&#xff0c;讓我不要往上走了&#xff0c;我猶豫了一會兒&#xff0c;還是聽勸地返…

wheel_legged_genesis 開源項目復現與問題記錄

Reinforcement learning of wheel-legged robots based on Genesis System Requirements Ubuntu 20.04/22.04/24.04 python > 3.10 開始配置環境&#xff01; 點擊releases后進入&#xff0c;下載對應最新版本的代碼&#xff1a; 將下載后的代碼包解壓到你的自定義路徑下&…

Gin框架從入門到實戰:核心用法與最佳實踐

為什么選擇Gin框架&#xff1f; Gin 是一個基于 Go 語言的高性能 Web 框架&#xff0c;具備以下優勢&#xff1a; 輕量高效&#xff1a;底層依賴 net/http&#xff0c;性能接近原生。簡潔優雅&#xff1a;API 設計友好&#xff0c;支持路由分組、中間件鏈、參數綁定等特性。生…

Leetcode 3468. Find the Number of Copy Arrays

Leetcode 3468. Find the Number of Copy Arrays 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3468. Find the Number of Copy Arrays 1. 解題思路 這一題的話思路上就是一個范圍考察&#xff0c;顯然&#xff0c;對于指定的copy方式&#xff0c;只要我們確定了第一個元素&…

VirtualBox虛擬機MacOS從Big Sur升級到Sequoia(失敗)

VirtualBox虛擬機里安裝好Big Sur版本&#xff0c;嘗試升級到Sequoia&#xff0c;但是最終失敗了。 軟件升級 直接在系統偏好-軟件更新里可以看到提示&#xff0c;提示可以升級到15版本Sequoia 點擊同意&#xff0c;看能不能升級到Sequoia吧。升級前先用時光做了備份。 升級…

[雜學筆記]HTTP1.0和HTTP1.1區別、socket系列接口與TCP協議、傳輸長數據的時候考慮網絡問題、慢查詢如何優化、C++的垃圾回收機制

目錄 1.HTTP1.0和HTTP1.1區別 2.socket系列接口與TCP協議 3.傳輸長數據的時候考慮網絡問題 4.慢查詢如何優化 5.C的垃圾回收機制 1.HTTP1.0和HTTP1.1區別 在連接方式上&#xff0c;HTTP1.0默認采用的是短鏈接的方式&#xff0c;就建立一次通信&#xff0c;也就是說即使在…