JAVAEE一>Spring IoC和DI詳解

目錄

  • Spring容器說明:
  • Ioc容器優勢:
  • DI介紹:
  • 從Spring獲取對象:
    • 獲取對象的方法:
    • 關于上下文的概念:
  • @Controller注解(控制層:接收參數并響應):
  • @Service注解(業務邏輯層:處理業務數據):
  • @Repository注解(數據層:調用數據庫用來獲取數據):
  • @Configuration注解(配置層):
  • @Component注解在(組件層):
  • @Bean注解(方法注解):
  • 上面五大注解和方法注解的區別:
    • bean-->對象的命名規則:
  • Spring掃描路徑:
  • 什么是DI:
    • DI的常用方法:
      • 1.屬性注入:
      • 2.構造方法注入:
      • 3.set方法注入:
    • @Autowired存在的問題:
      • 解決措施:
        • 1.加上@Qualifier注解進一步通過名稱來找bean:
        • 2.加上@Primary注解:
        • 3.加上@Resource注解:
  • 面試題:@Resource和@Autowired的區別:
    • @Autowired的裝配順序:

Spring容器說明:

Spring 就是?種IoC容器,Spring 容器 管理的主要是對象, 這些對象, 我們稱之為"Bean". 我們把這些對象交由Spring管理, 由
Spring來負責對象的創建和銷毀. 我們程序只需要告訴Spring, 哪些需要存, 以及如何從Spring中取出對象


把對象交給Spring管理,需要添加一些注解這里共有兩類注解可以使用:
1.類注解:@Controller,@Service,@Repository,@Component,@Configuration


2.方法注解:@Bean


我們接下來就主要圍繞注解的使用來講解

Ioc容器優勢:

1.控制權發生反轉:不在需要使用方,創建對象并控制依賴,不需要自己創建對象和初始化,這就是控制反轉


2.集中資源管理:
IOC容器會幫我們管理一些資源(對象)時, 只需要從IoC容器中去取
就可以了


3.降低資源的耦合度:我們在創建實例的時候不需要了解其中的細節, 降低了使用資源雙方的依賴程度

DI介紹:

DI就是注入依賴,容器在運行時動態的為程序注入所需的依賴
依賴就是程序運行時需要的一些成員屬性

從Spring獲取對象:

因為對象被交給了Spring管理,所以我們要先獲取Spring的上下文->ApplicationContext,再來根據方法獲取對象

獲取對象的方法:

這里我們主要根據名稱獲取,這個名稱是唯一的,根據類型獲取,這個類型就是某個類,根據名稱+類型獲取

// 1. 根據bean名稱獲取beanObject getBean(String var1) throws BeansException;// 2. 根據bean名稱和類型獲取bean<T> T getBean(String var1, Class<T> var2) throws BeansException;// 3. 按bean名稱和構造函數參數動態創建bean,只適?于具有原型(prototype)作?域的beanObject getBean(String var1, Object... var2) throws BeansException;// 4. 根據類型獲取bean<T> T getBean(Class<T> var1) throws BeansException;// 5. 按bean類型和構造函數參數動態創建bean, 只適?于具有原型(prototype)作?域的
bean<T> T getBean(Class<T> var1, Object... var2) throws BeansException;

關于上下文的概念:

比如線程上下文:一個棧結構,用于存儲上層線程的上下文信息,以便繼續執行。
包含當前線程的位置、設置、本地變量等信息。類似于一個環境和這里的Spring容器的上下文, 就是指當前的運行環境, 也可以看作是?個容器, 容器里存了很多內容, 這些內容是當前
運行的環境
**

@Controller注解(控制層:接收參數并響應):

使用@Controller 存儲對象(bean):

import org.springframework.stereotype.Controller;@Controller
public class HelloController {public void print(){System.out.println("do Controller");}
}

用名稱獲取對象:就是把對象交給Spring容器管理

public static void main(String[] args) {//獲取Spring上下文ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args);HelloController bean1 = (HelloController) context.getBean("helloController");bean1.print();

這里是引用

用類型獲取對象:

 HelloController bean2 = context.getBean(HelloController.class);bean2.print();

這里是引用

使用類型和名稱獲取對象:

HelloController bean3 = context.getBean("helloController",HelloController.class);bean3.print();

這里是引用

@Service注解(業務邏輯層:處理業務數據):

存儲對象代碼如下:

import org.springframework.stereotype.Service;@Service
public class UserService {public void print(){System.out.println("do Service");}
}

使用類型獲取對象:

 UserService bean7 = context.getBean(UserService.class);bean7.print();

@Repository注解(數據層:調用數據庫用來獲取數據):

存儲對象代碼如下:

import org.springframework.stereotype.Repository;@Repository
public class UserRepository {public void print(){System.out.println("do Repository");}
}

使用類型獲取對象:

UserRepository bean6 = context.getBean(UserRepository.class);bean6.print();

@Configuration注解(配置層):

存儲對象代碼如下:

import org.springframework.context.annotation.Configuration;@Configuration("reNameBean")
public class UserConfig {public void print(){System.out.println("do config");}
}

使用類型獲取對象:

UserConfig bean4 = context.getBean(UserConfig.class);bean4.print();

@Component注解在(組件層):

存儲對象代碼如下:

import org.springframework.stereotype.Component;@Component
public class UserComponent {public void print(){System.out.println("do Component");}
}

使用類型獲取對象:

UserComponent bean8 = context.getBean(UserComponent.class);bean8.print();

@Bean注解(方法注解):

注意:方法注解使用時候注意要搭配以上的五大類注解使用:


Bean這個注解使用的場景:一個類需要多個對象:(上面的五大注解,只可以有一個對象)


以上五大注解和這個類注解都可以修改,對象的名字,就是讓Spring按照我們的名字管理
在這里插入圖片描述

查看對象:按照修改的對象

Student bean9 = (Student) context.getBean("ss1");System.out.println(bean9);Student bean10 = (Student) context.getBean("s2");System.out.println(bean10);

上面五大注解和方法注解的區別:

除了控制層必須使用注解(@Controller)之外,其他四個注解都可以替換使用,但是一般規范來說都在各自的層級使用


控制層使用其他注解有時候可以使用成功但是不穩定不規范


注解細節:
在這里插入圖片描述

bean–>對象的命名規則:

從Spring容器獲取對象時,通過名稱獲取就需要命名:


五大類注解:
以小駝峰命名,如果類名前兩個字母為大寫那么就是這個類名本身
在這里插入圖片描述


bean注解:
方法注解要搭配類注解使用,命名默認為方法名
在這里插入圖片描述在這里插入圖片描述

Spring掃描路徑:

Spring掃描路徑是啟動類所在路徑,的子路徑及子孫路徑一直往后掃描
在這里插入圖片描述


修改后演示:
在這里插入圖片描述
發現其路徑,剛開始的”HelloController“都啟動不了:
在這里插入圖片描述


也可以通過注解手動修改啟動類路徑:@ComponentScan
在這里插入圖片描述

什么是DI:

DI就是依賴注入,它是一個過程,就是把Spring管理的依賴就是對象,拿出來再注入到指定的屬性中

DI的常用方法:

1.屬性注入:

通過注解@Autowired來實現:
在這里插入圖片描述


需要注入的屬性1


需要注入的屬性2


結果:
在這里插入圖片描述

2.構造方法注入:

構造方法注入需要注意:
當有一個構造方法時,沒得選可以注入成功,但是有多個構造方法時注入由于反射機制去獲取無參數的構造方法


有多個構造方法時,由于反射機制,會去選擇無參數的構造方法導致對象沒有注入
在這里插入圖片描述


這個時候就需要加上@Autowired注解,選中使用的構造方法:
在這里插入圖片描述

3.set方法注入:

在set方法加上@Autowired注解就行:
在這里插入圖片描述在這里插入圖片描述

@Autowired存在的問題:

@Autowired注解通過類型來找到對象,如果有多個對象,就會報錯:因為@Autowired注解首先按照類型來找對象的,找到多個對象不知道使用哪個
在這里插入圖片描述

解決措施:

1.加上@Qualifier注解進一步通過名稱來找bean:

@Qualifier注解不能單獨使用,必須配合@Autowired使用


在這里插入圖片描述在這里插入圖片描述

2.加上@Primary注解:

@Primary,沒有參數,所以使用在多個對象那一級來指定
在這里插入圖片描述


指定:
在這里插入圖片描述
在這里插入圖片描述

3.加上@Resource注解:

@Resource注解:直接通過name屬性來指定要注入的bean名稱:


在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述

面試題:@Resource和@Autowired的區別:

面試官喜歡聽到的回答:按照類型來
1.@Autowird注解是Spring提高的注解,而@Resource注解是jdk提供的
2.@Resource按照名稱注入,@Autowired按照類型注入,@Resource支持更多參數設置,按照name屬性來找bean


拓展:@Resource不完全按照名稱查找,也需要在類型的基礎上按照名稱查找

@Autowired的裝配順序:

首先按照類型找bean,找不到拋異常,找到一個裝配;如果找到多個對象時按照@Qualifier查找,我們找到@Qualifier是按照名稱來找bean的,所以@Autowired準確來說是按照“類型+名稱”來注入對象的
在這里插入圖片描述

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

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

相關文章

(四)趣學設計模式 之 原型模式!

目錄 一、 啥是原型模式&#xff1f;二、 為什么要用原型模式&#xff1f;三、 原型模式怎么實現&#xff1f;四、 原型模式的應用場景五、 原型模式的優點和缺點六、 總結 &#x1f31f;我的其他文章也講解的比較有趣&#x1f601;&#xff0c;如果喜歡博主的講解方式&#xf…

完美解決:.vmx 配置文件是由 VMware 產品創建,但該產品與此版 VMware Workstation 不兼容

參考文章&#xff1a;該產品與此版 VMware Workstation 不兼容&#xff0c;因此無法使用 問題描述 當嘗試使用 VMware Workstation 打開別人的虛擬機時&#xff0c;可能會遇到以下報錯&#xff1a; 此問題常見于以下場景&#xff1a; 從其他 VMware 版本&#xff08;如 ESX…

Linux——安裝Git的方法

安裝Git的命令&#xff1a; yum -y install git查看Git的版本&#xff1a; git --version

編程小白沖Kaggle每日打卡(13)--kaggle學堂:<機器學習簡介>基礎數據探索

Kaggle官方課程鏈接&#xff1a;Basic Data Exploration 本專欄旨在Kaggle官方課程的漢化&#xff0c;讓大家更方便地看懂。 Basic Data Exploration 加載并理解您的數據。 使用Pandas熟悉您的數據 任何機器學習項目的第一步都是熟悉數據。您將使用Pandas庫進行此操作。Pand…

從零開始的網站搭建(以照片/文本/視頻信息通信網站為例)

本文面向已經有一些編程基礎&#xff08;會至少一門編程語言&#xff0c;比如python&#xff09;&#xff0c;但是沒有搭建過web應用的人群&#xff0c;會寫得盡量細致。重點介紹流程和部署云端的步驟&#xff0c;具體javascript代碼怎么寫之類的&#xff0c;這里不會涉及。 搭…

【Java項目】基于SpringBoot的【高校校園點餐系統】

【Java項目】基于SpringBoot的【高校校園點餐系統】 技術簡介&#xff1a;采用Java技術、MySQL數據庫、B/S結構實現。 系統簡介&#xff1a;高校校園點餐系統是一個面向高校師生的在線點餐平臺&#xff0c;主要分為前臺和后臺兩大模塊。前臺功能模塊包括&#xff08;1&#xff…

Django check_password原理

check_password 是 Django 提供的一個用于密碼校驗的函數&#xff0c;它的工作原理是基于密碼哈希算法的特性。 Django 的 make_password 函數在生成密碼哈希時&#xff0c;會使用一個隨機的 salt&#xff08;鹽值&#xff09;。這個 salt 會與密碼一起進行哈希運算&#xff0…

Vulnhun靶機-kioptix level 4-sql注入萬能密碼拿到權限ssh連接利用mysql-udf漏洞提權

目錄 一、環境搭建信息收集掃描ip掃描開放端口掃描版本服務信息指紋探測目錄掃描 二、Web滲透sql注入 三、提權UDF提權修改權限 一、環境搭建 然后選擇靶機所在文件夾 信息收集 本靶機ip和攻擊機ip 攻擊機&#xff1a;192.168.108.130 靶機&#xff1a;192.168.108.141 掃描…

PHP 會話(Session)實現用戶登陸功能

Cookie是一種在客戶端和服務器之間傳遞數據的機制。它是由服務器發送給客戶端的小型文本文件&#xff0c;保存在客戶端的瀏覽器中。每當瀏覽器向同一服務器發送請求時&#xff0c;它會自動將相關的Cookie信息包含在請求中&#xff0c;以便服務器可以使用這些信息來提供個性化的…

PAT 甲級 1090 Highest Price in Supply Chain

構造一個二維數組 v &#xff0c;v[i] 存放指向 i 的所有元素。 構造隊列 q 存放每個待讀取的節點。 構造數組 high 存放每個節點的高度&#xff08;第幾級經銷商&#xff09; #include<iostream> #include<queue> #include<cmath> using namespace std; …

DeepSeek掘金——SpringBoot 調用 DeepSeek API 快速實現應用開發

Spring Boot 實現 DeepSeek API 調用 1. 項目依賴 在 pom.xml 中添加以下依賴: <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency>&l…

算法——數學建模的十大常用算法

數學建模的十大常用算法在數學建模競賽和實際問題解決中起著至關重要的作用。以下是這些算法的具體信息、應用場景以及部分算法的C語言代碼示例&#xff08;由于篇幅限制&#xff0c;這里只給出部分算法的簡要代碼或思路&#xff0c;實際應用中可能需要根據具體問題進行調整和擴…

推薦幾款SpringBoot項目手腳架

作為程序員、一般需要搭建項目手腳架時、都會去Gitee或Github上去找、但是由于Github在國內并不穩定、所以就只能去Gitee去上查找。 不同語言檢索方式不一樣、但是也類似。 Gitee WEB應用開發 / 后臺管理框架 芋道源碼 ELADMIN 后臺管理系統 一個基于 Spring Boot 2.7.1…

智能自動化新紀元:AI與UiPath RPA的協同應用場景與技術實踐

智能自動化新紀元&#xff1a;AI與UiPath RPA的協同應用場景與技術實踐 引言 在數字化轉型的浪潮中&#xff0c;企業對于自動化技術的需求已從簡單的任務執行轉向更復雜的智能決策。傳統RPA&#xff08;Robotic Process Automation&#xff09;通過模擬人類操作處理重復性任務…

數據結構:動態數組vector

vector 是 C 標準庫的動態數組。 在C語言中一般初學者會使用malloc&#xff0c;int[n]等方式來創建靜態數組&#xff0c;但是這種方式繁瑣且容易出錯。我們做算法題一般使用動態數組vector&#xff0c; 并且在刷題網站的題目給的輸入一般也是vector類型。 示例&#xff1a;vect…

基于深度學習的信號濾波:創新技術與應用挑戰

一、引言 1.1 研究背景 隨著科技的不斷發展&#xff0c;信號處理領域面臨著越來越復雜的挑戰。在眾多信號處理技術中&#xff0c;基于深度學習的信號濾波技術逐漸嶄露頭角&#xff0c;成為研究的熱點。 基于深度學習的信號濾波在信號處理領域具有至關重要的地位。如今&#…

前端八股——JS+ES6

前端八股&#xff1a;JSES6 說明&#xff1a;個人總結&#xff0c;用于個人復習回顧&#xff0c;將持續改正創作&#xff0c;已在語雀公開&#xff0c;歡迎評論改正。

醫院安全(不良)事件上報系統源碼,基于Laravel8開發,依托其優雅的語法與強大的擴展能力

醫院安全&#xff08;不良&#xff09;事件上報系統源碼 系統定義&#xff1a; 規范醫院安全&#xff08;不良&#xff09;事件的主動報告&#xff0c;增強風險防范意識&#xff0c;及時發現醫院不良事件和安全隱患&#xff0c;將獲取的醫院安全信息進行分析反饋&#xff0c;…

H3C交換機路由器防火墻FTP/TFTP服務器搭建。

軟件介紹。 3CDaemon 2.0 - Download 3CDaemon 是一款集成了多種網絡服務功能的工具軟件&#xff0c;主要用于網絡管理和文件傳輸&#xff0c;支持TFTP、FTP、Syslog等多種協議&#xff0c;廣泛應用于網絡設備的配置和管理。 1. 主要功能 TFTP服務器&#xff1a;支持TFTP協議…

數據庫連接管理--Java連接數據庫的幾種方式

1.數據庫連接管理 1.1 使用JDBC獲取連接 JDBC是Java標準庫提供的API&#xff0c;用于連接和操作關系型數據庫。它是最基礎、最常用的數據庫連接方式。 步驟&#xff1a; 加載數據庫驅動。建立連接。創建Statement或PreparedStatement對象。執行SQL查詢或更新。處理結果集。關…