學習springIOC

第二章 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>

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

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

相關文章

Android實現手寫輸入

android應用開發中有時會有手寫輸入需求&#xff0c;非通過系統鍵盤手寫功能&#xff0c;比如自定義鍵盤&#xff0c;這時就需要自己來實現&#xff0c;一般有兩種場景&#xff1a;一種是類似手寫簽名保存&#xff1b;另一種是真正的手寫輸入&#xff0c;需要將筆跡識別成正確的…

JTracker IDEA 中最好的 MyBatis 日志格式化插件

前言 如果你使用 MyBatis ORM 框架&#xff0c;那么你應該用過 MyBatis Log 格式化插件&#xff0c;它可以讓我們的程序輸出的日志更人性化。 但是有一個問題&#xff0c;通常我們只能看到格式化后的效果&#xff0c;沒辦法知道這個 SQL 是誰執行的以及調用的鏈路。 如下圖所…

文章解讀與仿真程序復現思路——電網技術EI\CSCD\北大核心《考慮復合指標優化模態分解和 Stacking 集成的綜合能源系統多元負荷預測》

本專欄欄目提供文章與程序復現思路&#xff0c;具體已有的論文與論文源程序可翻閱本博主免費的專欄欄目《論文與完整程序》 論文與完整源程序_電網論文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 電網論文源程序-CSDN博客電網論文源…

【stm32】大一上學期筆記復制

砌墻單片機 外設是什么&#xff1f; ipage 8 nx軸 128 X0-127 y0-63 PWM脈沖寬度調制 PWM脈沖寬度調制 2023年10月13日 基本特性&#xff1a;脈沖寬度調制PWM是一種對模擬信號進行數字編碼的方法。廣泛引用于電機控制&#xff0c;燈光的亮度調節&#xff0c;功率控制等領域…

趕緊收藏!全網最佳WebSocket封裝:完美支持斷網重連,自動心跳!

文章目錄 一、WebSocket封裝庫簡介二、庫的安裝與配置2.1 安裝2.2 初始化 三、功能詳解3.1 斷網重連3.2 自動心跳3.3 消息隊列3.4 事件管理 四、示例代碼五、總結 &#x1f389;歡迎來到Java學習路線專欄~探索Java中的靜態變量與實例變量 ☆* o(≧▽≦)o *☆嗨~我是IT陳寒&…

Windows Server 2019部署網絡負載均衡NLB服務的詳細操作步驟

部署前準備 首先需要準備兩臺Windows Server 2019服務器&#xff0c;虛擬機創建請參考 VMware Workstation安裝Windows Server2019系統詳細操作步驟_安裝windows server 2019操作系統(寫出操作過程)-CSDN博客 克隆虛擬機請參考 VMware Workstation克隆虛擬機詳細步驟-CSDN博…

超詳細的 C++中的封裝繼承和多態的知識總結<2.多態>

引言 小伙伴們我們都知道了&#xff0c;什么是封裝和繼承&#xff0c;在有了這個的基礎上我們接著來看什么是多態。多態從字面上意思我們就可以知道&#xff0c;大概就是一個函數的不同形態&#xff0c;而且&#xff0c;前邊我們在學習函數重載的時候我們已經簡單的了解了如何用…

[Swiper]在React中使用Swiper時注意銷毀實例

swiper版本號&#xff1a; {"swiper": "^4.4.2", }在useEffect中初始化swiper實例&#xff0c;由于依賴項的變更&#xff0c;可能會重復初始化: useEffect(() > {swiper.current new Swiper(#mainSwiper, {autoplay: {delay: 3000,//3秒切換一次},on…

Android 休眠流程(三)

Android 休眠流程(三) 上一篇《Android 休眠流程(二)》簡單講解內核階段進入休眠流程,本篇繼續深挖,簡單講解休眠進入ATF。ATF(ARM Trusted Firmware) 的體系架構里將整個系統分成四種安全等級,分別為:EL0、EL1、EL2、EL3。將整個安全啟動的流程階段定義為:BL1、BL2…

相等運算符==與 === 的區別

相等運算符用來比較兩個值是否相等 1、運算符 如果相等會返回true&#xff0c;否則返回false使用 來做相等運算當使用來比較兩個值時,如果值的類型不同&#xff0c;則會自動進行類型轉換&#xff0c;將其轉換為相同的類型比較 console.log("1" 1); //true console.…

機器學習算法 —— 基于penguins_raw數據集的決策樹

??歡迎來到 我的博客 —— 探索技術的無限可能! ??博客的簡介(文章目錄) 目錄 實戰演示基于penguins_raw數據集的決策樹實戰導入模塊數據信息簡單查看可視化描述利用 決策樹模型 在二分類上 進行訓練和預測利用 決策樹模型 在三分類(多分類)上 進行訓練和預測實戰 演示…

OCI對象存儲數據轉移到另一個桶

// 舊桶 String bucketName_old “Bucket-old”; // 新桶 String bucketName_new “Bucket-new”; // 圖片前綴 String filePrefix “obj-filePrefix/”; AmazonS3 instance AmazonS3ClientFactory.getS3Instance(); String continuationToken null; int num 0; try { do…

推薦算法學習筆記2.1:基于深度學習的推薦算法-基于共線矩陣的深度推薦算法-AutoRec模型

AutoRec模型 前置知識&#xff1a;推薦算法學習筆記1.1:傳統推薦算法-協同過濾算法 AutoRec模型通過引入自編碼器結構&#xff0c;將共線矩陣中的用戶向量&#xff08;基于用戶的U-AutoRec&#xff09;或物品向量&#xff08;基于物品的I-AutoRec&#xff09;嵌入到低維空間后還…

訊方技術鴻蒙應用定制開發服務上架華為云商店

在當前智能化與互聯互通發展的時代背景下&#xff0c;鴻蒙操作系統已成為推動創新應用發展的新引擎。隨著企業對個性化智能解決方案需求的不斷增長&#xff0c;鴻蒙應用定制開發已成為企業技術轉型升級的重要途徑。 訊方技術作為一家致力于為客戶提供全面專業服務的企業&#…

LVM核心概念

1. LVM簡介 LVM是邏輯盤卷管理&#xff08;Logical Volume Manager&#xff09;的簡稱&#xff0c;它是Linux環境下對磁盤分區進行管理的一種機制&#xff0c;LVM是建立在硬盤和分區之上的一個邏輯層&#xff0c;來提高磁盤分區管理的靈活性。 優點&#xff1a; 可以靈活分配…

Java中如何實現一個線程安全的HashMap?

在Java中&#xff0c;實現一個線程安全的HashMap可以通過使用java.util.concurrent.ConcurrentHashMap類來實現。ConcurrentHashMap類是Java并發包java.util.concurrent的一部分&#xff0c;它提供了一種線程安全的哈希表實現。 以下是如何使用ConcurrentHashMap實現線程安全的…

2024年,精品課錄制新方式,站在大屏前錄出綠幕摳像的效果!感謝不坑盒子!

先做個小調查&#xff1a;你們那邊請工作室錄一節課&#xff0c;多少錢&#xff1f;留言區交流一下。 暑假了&#xff0c;老師們又有時間來錄課了。 早在2021年秋天&#xff0c;精品課遴選的第一年&#xff0c;我就第一時間給大家分享了2種錄精品課的方法&#xff1a;大屏前錄…

python源碼:opencv多視頻源同屏拼接播放

一、前言 如標題所示&#xff0c;這個python代碼的目的是利用opencv模塊實現多視頻源同屏拼接播放的&#xff0c;里面包含視頻播放尺寸修改、視頻播放加序號、視頻流存活檢測等方案&#xff0c;可做擴展開發使用。 二、代碼 import cv2 import time from func_timeout import …

C++文件系統操作1 - 跨平臺實現文件的創建和刪除

1. 關鍵詞2. fileutil.h3. fileutil.cpp4. filetype.h5. filesystem_win.cpp6. filesystem_unix.cpp7. 源碼地址 1. 關鍵詞 C 文件系統操作 創建文件 刪除文件 創建軟連接 刪除軟連接 跨平臺 2. fileutil.h #pragma once#include <string> #include <cstdio> #i…

JAVA里的BigDecimal用法

public class BigDecimaldemo1 {public static void main(String[] args) {System.out.println(0.090.01);//為什么不是0.10呢?} }在使用float或者double類型的數據在進行數學運算的時候&#xff0c;很有可能會產生精度丟失問題。我們都知道計算機底層在進行運算的時候&#x…