Spring Ioc學習

第二章 Spring IOC

章節內容

  • Spring IOC技術實現
  • Spring IOC設值注入
  • Spring IOC構造注入

章節目標

  • 掌握Spring IOC技術實現
  • 掌握Spring IOC設置注入
  • 掌握Spring IOC構造注入

第一節 Spring簡介

1. Spring 簡介

Spring 是目前主流的 Java 開發框架,是 Java 世界最為成功的框架。其目的是用于簡化企業級應用程序開發的難度和周期,任何 Java 應用都可以從 Spring 中受益。Spring 框架還是一個超級粘合平臺,除了自己提供功能外,還提供粘合其他技術和框架的能力。

什么是框架? 框架是一個半成品,提供了基本的運行功能,但具體業務實現需要我們去編寫。

2. Spring體系結構

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

EL = Expression Language 表達式語言

SpEL = Spring Expression Language Spring表達式語言

2.1 Data Access/Integration

Data Access/Integration表示數據訪問/集成層,包含了JDBC、ORM、OXM、JMS、Transactions模塊。

JDBC 模塊

提供了一個 JBDC 的樣例模板,使用這些模板能消除傳統冗長的 JDBC 編碼還有必須的事務控制,而且能享受到 Spring 管理事務的好處。

ORM 模塊

提供與流行的“對象-關系”映射框架無縫集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且還可以使用 Spring 事務管理,無需額外控制事務。

OXM 模塊

提供了一個支持 Object /XML 映射的抽象層實現,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。將 Java 對象映射成 XML 數據,或者將XML 數據映射成 Java 對象。

JMS 模塊

指 Java 消息服務,提供一套 “消息生產者、消息消費者”模板用于更加簡單的使用 JMS,JMS 用于在兩個應用程序之間,或分布式系統中發送消息,進行異步通信。

Transactions 事務模塊

支持編程和聲明式事務管理。

2.2 Web

Spring 的 Web 層包括 Web、Servlet、WebSocket 和 Portlet 組件。

Web 模塊

提供了基本的 Web 開發集成特性,例如多文件上傳功能、使用的 Servlet 監聽器的 IOC 容器初始化以及 Web 應用上下文。

Servlet 模塊

提供了一個 Spring MVC Web 框架實現。Spring MVC 框架提供了基于注解的請求資源注入、更簡單的數據綁定、數據驗證以及一套非常易用的 JSP 標簽,完全無縫與 Spring 其他技術協作。

WebSocket 模塊

提供了簡單的接口,用戶只要實現響應的接口就可以快速的搭建 WebSocket Server,從而實現雙向通訊。

Portlet 模塊

提供了在 Portlet 環境中使用 MVC 實現,類似 Web-Servlet 模塊的功能。

2.3 Core Container

Spring 的核心容器是其他模塊建立的基礎,由 Beans 模塊、Core 核心模塊、Context 上下文模塊和 SpEL 表達式語言模塊組成,沒有這些核心容器,也不可能有 AOP、Web 等上層的功能。

Beans 模塊

提供了框架的基礎部分,包括控制反轉和依賴注入。

Core 核心模塊

封裝了 Spring 框架的底層部分,包括資源訪問、類型轉換及一些常用工具類。

Context 上下文模塊

建立在 Core 和 Beans 模塊的基礎之上,集成 Beans 模塊功能并添加資源綁定、數據驗證、國際化、Java EE 支持、容器生命周期、事件傳播等。ApplicationContext 接口是上下文模塊的焦點。

SpEL 模塊

提供了強大的表達式語言支持,支持訪問和修改屬性值,方法調用,支持訪問及修改數組、容器和索引器,命名變量,支持算數和邏輯運算,支持從 Spring 容器獲取 Bean,它也支持列表投影、選擇和一般的列表聚合等。

2.4 AOP、Aspects、Instrumentation和Messaging

在 Core Container 之上是 AOP、Aspects 等模塊。

AOP 模塊

提供了面向切面編程實現,提供比如日志記錄、權限控制、性能統計等通用功能和業務邏輯分離的技術,并且能動態的把這些功能添加到需要的代碼中,這樣各司其職,降低業務邏輯和通用功能的耦合。

Aspects 模塊

提供與 AspectJ 的集成,是一個功能強大且成熟的面向切面編程(AOP)框架。

Instrumentation 模塊

提供了類工具的支持和類加載器的實現,可以在特定的應用服務器中使用。

messaging 模塊

Spring 4.0 以后新增了消息(Spring-messaging)模塊,該模塊提供了對消息傳遞體系結構和協議的支持。

2.5 Test模塊

Test 模塊

Spring 支持 Junit 和 TestNG 測試框架,而且還額外提供了一些基于 Spring 的測試功能,比如在測試 Web 框架時,模擬 Http 請求的功能。

第二節 Spring IOC

1. IOC 概念

IOC全稱為 Inverse Of Control,表示控制反轉。指的是程序員使用硬編碼創建的對象轉為由Spring容器來創建,對于對象生命周期的控制交給Spring容器來管理。控制反轉解決了具有依賴關系的組件之間的強耦合,使得項目形態更加穩健

2. 如何使用 IOC

2.1 依賴包引入
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.11</version>
</dependency>
2.3 創建類
public class User {
}
2.2 編寫配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean標簽表示一個對象--><bean name="user" class="com.qf.spring.ioc.model.User" />
</beans>
2.4 編寫測試案例
public class BeanTest {@Testpublic void getIocTest(){//應用上下文使用的是類路徑下XML文檔作為當前應用上下文ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");//從上下文中根據bean的名稱或者ID獲取bean對象User user = context.getBean("user", User.class);System.out.println(user);}
}

3. DI概念

DI全稱為Dependency Injection,表示依賴注入。指的是在Spring創建對象的同時,為其屬性賦值

4. 如何使用 DI

4.1 在類中添加屬性
@Data
public class User {private String username;private String password;
}
4.2 修改配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean標簽表示一個對象--><bean name="user" class="com.qf.spring.ioc.model.User"><!--為對象的屬性注入值:這里name屬性的值必須與set方法保持一致--><property name="username" value="admin" /><property name="password" value="123456" /></bean>
</beans>
4.3 再次測試

5. 注入方式

5.1 設值注入

設值注入指的是通過set方法為屬性注入值。設值注入必須保證存在無參構造,否則將報錯。

@Data
public class Student {private String name;private String sex;private int age;private Date birthday;
}
<!--application.xml-->
<bean name="stu" class="com.qf.spring.ioc.model.Student"><property name="name" value="張三" /><property name="age" value="20" /><property name="sex" value="" /><!--這里需要注意:日期類型的默認格式yyyy/MM/dd--><property name="birthday" value="2021/10/10" />
</bean>
@Test
public void studentTest(){//應用上下文使用的是類路徑下XML文檔作為當前應用上下文ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");//從上下文中根據bean的名稱或者ID獲取bean對象Student stu = context.getBean("stu", Student.class);System.out.println(stu);
}
5.2 構造注入

構造注入指的是通過構造放入為屬性注入值。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String name;private String sex;private int age;private Date birthday;
}
<!--application.xml-->
<bean name="s" class="com.qf.spring.ioc.model.Student"><!--這里按照順序為屬性注入值--><constructor-arg index="0" value="李四" /><constructor-arg index="1" value="" /><constructor-arg index="2" value="22" /><constructor-arg index="3" value="2020/05/05" />
</bean>
@Test
public void studentConstructorTest(){//應用上下文使用的是類路徑下XML文檔作為當前應用上下文ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");//從上下文中根據bean的名稱或者ID獲取bean對象Student stu = context.getBean("s", Student.class);System.out.println(stu);
}

6. 注入類型

6.1 注入常用數據類型

常用數據類型指8種基本數據類型以及對應的包裝類、日期類型、字符串等。

6.2 注入引用數據類型

對于引用數據類型,spring 提供了兩種注入值的方式。一種是通過 ref 屬性來引用 bean 對象進行值的注入,一種是通過 bean 標簽來創建一個 bean 對象進行值的注入。

<property name="" ref="" /><property name=""><bean class=""></bean>
</property>
@Data
public class User {private String username;private String password;private UserInfo userInfo;
}@Data
public class UserInfo {private int id;private String name;private String sex;private int age;
}
<bean id="info" class="com.qf.spring.ioc.model.UserInfo"><property name="id" value="1" /><property name="name" value="張三" /><property name="sex" value="" /><property name="age" value="20" />
</bean><!--bean標簽表示一個對象-->
<bean name="user" class="com.qf.spring.ioc.model.User"><!--為對象的屬性注入值:這里name屬性的值必須與set方法保持一致--><property name="username" value="admin" /><property name="password" value="123456" /><!--引用id為info的bean對象進行值的注入--><property name="userInfo" ref="info" />
</bean><bean name="u" class="com.qf.spring.ioc.model.User"><!--為對象的屬性注入值:這里name屬性的值必須與set方法保持一致--><property name="username" value="admin" /><property name="password" value="123456" /><property name="userInfo"><!--使用bean標簽創建一個bean對象進行值的注入--><bean class="com.qf.spring.ioc.model.UserInfo"><property name="id" value="2" /><property name="name" value="李四" /><property name="sex" value="" /><property name="age" value="22" /></bean></property>
</bean>
6.3 注入數組

spring 提供了 array 標簽來進行數組類型的屬性值的注入。

@Data
public class Clazz {private int id;private String name;private Student[] students;
}
<bean name="clazz" class="com.qf.spring.ioc.model.Clazz"><property name="id" value="1" /><property name="name" value="張三" /><property name="students"><array><!--引用數據類型 可以使用bean標簽創建bean對象注入值--><!--<bean class=""></bean>--><!--引用數據類型 可以使用ref標簽引用bean對象注入值--><ref bean="s" /><ref bean="stu" /><!--常用數據類型 可以使用value標簽直接注入值--><!-- <value></value>--></array></property>
</bean>
6.4 注入集合
6.4.1 List集合
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Student {private String name;private String sex;private int age;private Date birthday;private List<Double> scores;
}
<bean name="stu" class="com.qf.spring.ioc.model.Student"><property name="name" value="張三" /><property name="age" value="20" /><property name="sex" value="" /><!--這里需要注意:日期類型的默認格式yyyy/MM/dd--><property name="birthday" value="2021/10/10" /><property name="scores"><list><value>80.0</value><value>90.0</value><value>81.0</value><value>82.0</value></list></property>
</bean><bean name="s" class="com.qf.spring.ioc.model.Student"><!--這里按照順序為屬性注入值--><constructor-arg index="0" value="李四" /><constructor-arg index="1" value="" /><constructor-arg index="2" value="22" /><constructor-arg index="3" value="2020/05/05" /><constructor-arg index="4"><list><value>80.0</value><value>90.0</value><value>81.0</value><value>82.0</value></list></constructor-arg>
</bean>
6.4.2 Set集合
@Data
public class Person {private String name;private Set<String> friendNames;
}
<bean name="p" class="com.qf.spring.ioc.model.Person"><property name="name" value="李剛" /><property name="friendNames"><set><value>李四</value><value>王五</value></set></property>
</bean>
6.4.3 注入Map
@Data
public class Person {private String name;private List<String> friendNames;private Map<String, Object> map;
}
<bean name="p" class="com.qf.spring.ioc.model.Person"><property name="name" value="李剛" /><property name="friendNames"><set><value>李四</value><value>王五</value></set></property><property name="map"><map><entry key="hobby" value="聊天" /><entry key="clazz" value-ref="clazz"/></map></property><property name="props"><props><prop key="desc">我很帥</prop><prop key="secret">我有兩個女朋友</prop></props></property>
</bean>
6.4.4 注入Properties
@Data
public class Person {private String name;private List<String> friendNames;private Properties props;
}
<bean name="p" class="com.qf.spring.ioc.model.Person"><property name="name" value="李剛" /><property name="friendNames"><set><value>李四</value><value>王五</value></set></property><property name="props"><props><prop key="desc">我很帥</prop><prop key="secret">我有兩個女朋友</prop></props></property>
</bean>

Person {

private String name;private List<String> friendNames;private Properties props;

}


```xml
<bean name="p" class="com.qf.spring.ioc.model.Person"><property name="name" value="李剛" /><property name="friendNames"><set><value>李四</value><value>王五</value></set></property><property name="props"><props><prop key="desc">我很帥</prop><prop key="secret">我有兩個女朋友</prop></props></property>
</bean>

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

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

相關文章

基于Springboot+Vue+mysql倉庫管理系統倉庫進銷存管理系統

博主介紹&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C編程語言&#xff0c;同時也熟練掌握微信小程序、Php和Android等技術&#xff0c;能夠為大家提供全方位的技術支持和交流。 我有豐富的成品Java、Python、C#畢設項目經驗&#xff0c;能夠為學生提供各類…

Vue 父子頁面使用指南

Vue3父子頁面使用指南 Vue3作為一種現代化的前端框架&#xff0c;提供了強大的組件化功能&#xff0c;使得頁面開發更加模塊化和可維護。本文將深入探討Vue3中父子頁面的使用方法&#xff0c;包括如何傳遞參數、父組件如何調用子組件的方法&#xff0c;以及父子頁面的加載原理…

為什么面向對象的設計方法逐漸減少

在軟件開發領域&#xff0c;面向對象設計&#xff08;Object-Oriented Design, OOD&#xff09;曾經是主導的編程范式。它的主要特征是通過類和對象來組織代碼&#xff0c;并利用繼承、封裝和多態性等特性來實現代碼復用和模塊化。然而&#xff0c;近年來&#xff0c;隨著前端開…

【Python】Python中的數據類型

數據類型 導讀一、數據類型的分類1.1 Number&#xff08;數字&#xff09;1.1.1 靜態數據類型1.1.2 動態數據類型 1.2 String&#xff08;字符串&#xff09;1.3 bool&#xff08;布爾類型&#xff09; 二、數據類型的轉換2.1 隱式類型轉換2.2 顯式類型轉換2.2.1 int(x[,base])…

系統運維面試總結(shell編程)

SYNDDOS攻擊&#xff0c;需要判斷這個訪問是正常訪問還是信包攻擊&#xff0c;當前這個信包發起的訪問數量是多少&#xff0c;例如看到30個信包同時再訪問時設置監控報警。 一般選用/dev/urandom生成&#xff0c;但其生成的隨機數帶有二進制亂碼&#xff0c;所以需要tr命令…

光源基礎知識及選型原則

光的基礎知識 1.光譜(專業理解):光能量在不同頻率上的分布。 2.可見光的波段在380mm—700mm之間。紅光波長最長,為700mm左右,紫光波長最短,在380mm左右。 3.色溫(以白色為界):光源的顏色與黑體在某一溫度下輻射光的顏色相同(或最相近)時,黑體的溫度就稱為該光源…

CASS中按指定距離和方向移動圖形

1、繪制一個圖形 打開軟件&#xff0c;隨意繪制一個矩形&#xff0c;并量取左下角點的坐標值&#xff0c;具體如下&#xff1a; 2、按距離移動原理講解 例1&#xff1a;將圖形沿著y軸負方向移動100米&#xff0c;如何實現&#xff1f; 如上圖所示&#xff0c;測繪中的坐標系…

多載波調制與OFDM原理講解以及MATLAB實現GUI設計

前言 基于MATLAB設計并實現了一個OFDM調制的圖形用戶界面&#xff08;GUI&#xff09;系統。該系統旨在簡化OFDM調制過程的仿真&#xff0c;提供友好的用戶交互界面。設計目標是通過GUI實現參數化的OFDM仿真&#xff0c;包括子載波數、符號數、IFFT長度、循環前綴長度、循環后…

模擬退火算法2—優缺點

模擬退火算法優點 1、以一定的概率接受惡化解 模擬退火算法(SA)在搜索策略上與傳統的隨機搜索方法不同,它不僅引入了適當的隨機因素,而且還引入了物理系統退火過程的自然機理。這種自然機理的引入使模擬退火算法在迭代過程中不僅接受使目標函數變“好”的試探點,而且還能以一…

【單片機畢業設計選題24034】-基于STM32的手機智能充電系統

系統功能: 系統可以設置充電時長&#xff0c;啟動充電后按設置的充電時長充電&#xff0c;充電時間到后自動 停止充電&#xff0c;中途檢測到溫度過高也會結束充電并開啟風扇和蜂鳴器報警。 系統上電后&#xff0c;OLED顯示“歡迎使用智能充電系統請稍后”&#xff0c;兩秒鐘…

Python錯誤處理 -- 異常捕獲

本套課在線學習視頻&#xff08;網盤地址&#xff0c;保存到網盤即可免費觀看&#xff09;&#xff1a; ??https://pan.quark.cn/s/ebe046289eb0?? 本文詳細介紹了Python編程中try-except-else-finally語句的用法&#xff0c;重點講解了如何通過這些語句對程序中可能出現…

哨兵1SAR空間數據包協議數據單元文檔(五)

《哨兵1SAR空間數據包協議數據單元》文檔對數據包的結構進行了詳細描述&#xff0c;并提供了用戶數據的格式和解碼算法。 原文鏈接: 哨兵1SAR空間數據包協議數據單元文檔英文版 同系列中的其他文章篇鏈接: 哨兵1SAR空間數據包協議數據單元文檔&#xff08;一&#xff09; 哨兵1…

Vue 2 與 ECharts:結合使用實現動態數據可視化

在現代前端開發中&#xff0c;數據可視化變得越來越重要。ECharts 是一個強大的數據可視化庫&#xff0c;而 Vue 2 則是一個流行的前端框架。本文將介紹如何將 Vue 2 和 ECharts 結合使用&#xff0c;以實現動態數據可視化。 安裝與配置 首先&#xff0c;確保你的項目中已經安…

Redis數據結構——跳躍表 skiplist

跳躍表&#xff08;Skip List&#xff09;是一種數據結構&#xff0c;常被用作一種有序的數據結構&#xff0c;提供快速的插入、刪除和查找操作&#xff0c;其效率接近于平衡樹&#xff08;如紅黑樹&#xff09;&#xff0c;但實現起來更簡單。 1. 跳躍表的基本概念 層級結構…

保存在FinalShell服務器登錄密碼忘記了,如何快速獲取到

一、從FinalShell獲取服務器基本信息 如圖操作會導出一個json文件&#xff0c;可以直接保存在桌面&#xff0c;或者其他位置 json格式如下&#xff1a; {"forwarding_auto_reconnect":false ,"custom_size":false ,"delete_time":0 ,"sec…

Python數據分析-舊金山犯罪預測分析(San Francisco Crime Classification)

一、研究背景 舊金山是一個人口稠密、旅游業發達的城市&#xff0c;同時也是美國犯罪率較高的城市之一。隨著城市的不斷發展&#xff0c;犯罪行為的類型和頻率也在不斷變化&#xff0c;這對城市的治安管理和社會穩定構成了巨大的挑戰。近年來&#xff0c;數據科學技術的迅猛發…

xmind導入導出支持圖片功能源碼改造

xmind導入導出支持圖片功能 在開發用例管理平臺的過程中&#xff0c;需要使用xmind來管理用例。所以也涉及到xmind用例的導入導出功能&#xff0c; 在開始的時候&#xff0c;xmind文件中沒有圖片&#xff0c;所以使用xmind,xmindparser包就可以完成改任務。現在新增需求&#x…

C# 編程中互斥鎖的使用

C# 中的互斥鎖 互斥鎖是 C# 中使用的同步原語&#xff0c;用于控制多個線程或進程對共享資源的訪問。其目的是確保在任何給定時間只有一個線程或進程可以獲取互斥鎖&#xff0c;從而提供互斥。 C# 中互斥鎖的優點 可以使用互斥鎖 (Mutex) 并享受其帶來的好處。 1. 共享資源…

德國威步的技術演進之路(下):從云端許可管理到硬件加密狗的創新

從單機用戶許可證到WkNET網絡浮點授權的推出&#xff0c;再到引入使用次數和豐富的時間許可證管理&#xff0c;德國威步產品不斷滿足市場對靈活性和可擴展性的需求。TCP/IP浮動網絡許可證進一步展示了威步技術在網絡時代的創新應用。借助于2009年推出的借用許可證以及2015年推出…

mac磁盤工具如何合并分區 macos 磁盤工具 無法抹除 磁盤管理軟件哪個使用率最高

一、什么是NTFS格式分區 NTFS格式分區是微軟公司開發的諸多文件系統中的一種。NTFS格式分區是一種文件系統&#xff0c;磁盤只有在安裝了文件系統后才能被正常使用&#xff0c;文件系統的格式有非常多&#xff0c;常見的有FAT 32和NTFS。 作為常見文件系統&#xff0c;NTFS格式…