Spring框架學習筆記(一):Spring基本介紹(包含IOC容器底層結構)

1?官方資料?

1.1 官網

https://spring.io/

1.2?進入 Spring5

下拉 projects, 進入 Spring Framework

進入 Spring5 github

1.3 在maven項目中導入依賴

<dependencies><!--加入spring開發的基本包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.8</version></dependency><!--加入spring開發切面編程需要的包--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.8</version></dependency>
</dependencies>

?1.4 官方文檔

在線文檔 : https://docs.spring.io/spring-framework/docs/current/reference/html/
: spring-framework-5.3.8\docs\reference\html\index.html
線API:spring-framework-5.3.8/docs/javadoc-api/index.html

2?Spring核心內容

上圖說明:

(1)Spring 核心學習內容 IOC AOP, jdbcTemplate, 聲明式事務
(2)IOC: 控制反轉 , 可以管理 java 對象
(3)AOP : 切面編程
(4)JDBCTemplate : spring 提供一套訪問數據庫的技術
(5) 聲明式事務 : 基于 ioc/aop 實現事務管理
(6)IOC, AOP 是重點和難點

3 Spring的幾個重要概念

(1)Spring 可以整合其他的框架(Spring 是管理框架的框架)

(2)Spring 有兩個核心的概念: IOC AOP

(3)IOC(Inversion Of Control 反轉控制)

  • 傳統的開發模式[JdbcUtils / 反射]

程序------>環境(程序讀取環境配置,然后自己創建對象.)

解讀:程序員編寫程序, 在程序中讀取配置信息;創建對象, new 或者?反射方式;使用對象完成任務

  • IOC 的開發模式 [EmpAction EmpService EmpDao Emp]?

程序<-----容器(容器創建好對象,程序直接使用.)

解讀:?

1 Spring 根據配置文件 xml/ 注解 創建對象, 并放入到容器 (ConcurrentHashMap) , 并且可以完成對象之間的依賴
2 、當需要使用某個對象實例的時候 , 就直接從容器中獲取即可
3 、程序員可以更加關注如何使用對象完成相應的業務
4. DI—Dependency Injection 依賴注入,可以理解成是 IOC 的另外叫法 .
5. Spring 最大的價值,通過配置,給程序提供需要使用的
web [Servlet (Action/Controller) ]/Service/Dao/[JavaBean/entity] 對象 ,
這個是核心價值所在,也是 ioc 的具體體現 , 實現解耦.

4 Spring快速入門

4.1 需求說明

通過 Spring 的方式( 配置文件) ,獲取 JavaBean: Monster 的對象,并給該對象屬性賦值,輸出該對象信息.

4.2 實現步驟

(1)創建一個maven項目,在pom.xml文件中導入以下依賴

<dependencies><!--加入spring開發的基本包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.8</version></dependency><!--加入spring開發切面編程需要的包--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.8</version></dependency>
</dependencies>

(2) 創建 Moster 的javabean/entity,無參構造器一定要寫

public class Monster {private Integer monsterId;private String name;private String skill;//全參構造器public Monster(Integer monsterId, String name, String skill) {this.monsterId = monsterId;this.name = name;this.skill = skill;}//無參構造器一定要寫,Spring反射創建對象時,需要使用public Monster() {}public Integer getMonsterId() {return monsterId;}public void setMonsterId(Integer monsterId) {this.monsterId = monsterId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSkill() {return skill;}public void setSkill(String skill) {this.skill = skill;}@Overridepublic String toString() {return "Monster{" +"monsterId=" + monsterId +", name='" + name + '\'' +", skill='" + skill + '\'' +'}';}
}

(3) 新建一個容器配置文件:鼠標右鍵目錄名 --> new --> XML Configuration --> Spring Config,然后給配置文件取個名字,這里取beans(對于Maven項目XML文件通常在?src/main/resources?目錄)

點擊 創建 Spring facet ,然后點擊確定

?

?(4)在xml文件中配置Moster對象,在beans標簽加入以下配置

?注意:將class屬性值修改為指定類的全路徑

<!--1. 配置monster對象/javabean2. 在beans中可以配置多個bean3. 一個bean表示就是一個java對象4. class屬性是用于指定類的全路徑->spring底層使用反射創建5. id屬性表示該java對象在spring容器中的id, 通過id可以獲取到對象6. <property name="monsterId" value="100"> 用于給該對象的屬性賦值
-->
<bean class="com.spring.bean.Monster" id="monster01"><property name="monsterId" value="100"/><property name="name" value="牛魔王"/><property name="skill" value="芭蕉扇"/>
</bean><bean class="com.spring.bean.Monster" id="monster02"><property name="monsterId" value="1001"/><property name="name" value="牛魔王~"/><property name="skill" value="芭蕉扇~"/>
</bean>

(5)新建一個測試類來獲取容器中的對象

public class SpringBeanTest {@Testpublic void getMonster(){//1. 創建容器 ApplicationContext//2. 該容器和容器配置文件關聯ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");//3. 通過getBean獲取對應的對象//   默認返回的是Object , 但是運行類型Monster//Object monster01 = ioc.getBean("monster01");Monster monster01 = (Monster) ioc.getBean("monster01");//4. 輸出System.out.println("monster01=" + monster01 + " 運行類型=" + monster01.getClass());System.out.println("monster01=" + monster01 + "屬性name=" + monster01.getName() +" monserid=" + monster01.getMonsterId());//5. 也可以在獲取的時候,直接指定Class類型, 可以再次獲取Monster monster011 = ioc.getBean("monster01", Monster.class);System.out.println("monster011=" + monster011);System.out.println("monster011.name=" + monster011.getName());//6. 查看容器注入了哪些bean對象,會輸出bean的idSystem.out.println("================================");String[] beanDefinitionNames = ioc.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println("beanDefinitionName=" + beanDefinitionName);}System.out.println("================================");System.out.println("ok~~~");}
}

運行結果:

4.3 注意事項

(1)該代碼為什么讀取到beans.xml文件

ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("beans.xml");

該代碼通過類路徑加載配置文件,可通過以下方式輸出類加載路徑

File f = new File(this.getClass().getResource("/").getPath());
System.out.println(f);

maven項目的類加載路徑是:target\classes

(2)debug 看看 spring 容器結構/機制

?

(3) 當調用getBean(),方法獲取對象時,會去beanDefinitionMap中去查找,如果發生該bean是單例的,就會返回 singletonobject 中初始化好了的對象,如果不是,就會動態的通過反射機制返回一個臨時創建的對象

?5 實現簡單的基于XML配置的Spring

5.1?需求說明

(1)自己寫一個簡單的 Spring 容器, 通過讀取 beans.xml,獲取第 1 個 JavaBean: Monster 的
對象,并給該的對象屬性賦值,放入到容器中, 輸出該對象信息
(2)也就是說,不使用 Spring 原生框架,我們自己簡單模擬實現

5.2 思路分析

(1)使用xml的解析技術-Dom4j
(2)讀取beans.xml
(3)解析得到monster對象的id,classpath,屬性
(4)使用反射,創建對象
(5)放入到ioc容器(hashmap)
(6)提供一個getBean方法

5.3 實現步驟

(1)在maven項目中添加dom4j依賴

第一種方式:如果導入低版本(1.6.1),需要如下兩個依賴

<dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.6.1</version>
</dependency>
<dependency><groupId>jaxen</groupId><artifactId>jaxen</artifactId><version>1.1.1</version>
</dependency>

第二種方式:如果導入高版本(2.0.0),需要如下一個依賴

<dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.0.0</version>
</dependency>

(2)實現容器類 WwjApplicationContext,java

注意:項目系統目錄不能有中文,或者會找不到XML文件

package com.spring.wwjApplicationContext;import com.spring.bean.Monster;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.File;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;/*** 1. 這個程序用于實現Spring的一個簡單容器機制* 2. 這里實現如何將beans.xml文件進行解析,并生成對象,放入容器中* 3. 提供一個方法 getBean(id) 返回對應的對象*/
public class WwjApplicationContext {private ConcurrentHashMap<String, Object> singletonObjects =new ConcurrentHashMap<>();//構造器//接收一個容器的配置文件 比如 beans.xml, 該文件默認在resourcespublic WwjApplicationContext(String iocBeanXmlFile) throws Exception {//1. 得到類加載路徑
//        String path = this.getClass().getClassLoader().getPath();String path = this.getClass().getResource("/").getPath();//2. 創建 SaxreaderSAXReader saxReader = new SAXReader();//3. 得到Document對象Document document =saxReader.read(new File(path + iocBeanXmlFile));//4. 得到rootDocumentElement rootElement = document.getRootElement();//5. 得到第一個bean-monster01Element bean = (Element) rootElement.elements("bean").get(0);//6. 獲取到第一個bean-monster01的相關屬性String id = bean.attributeValue("id");String classFullPath = bean.attributeValue("class");List<Element> property = bean.elements("property");//遍歷Integer monsterId =Integer.parseInt(property.get(0).attributeValue("value"));String name = property.get(1).attributeValue("value");String skill = property.get(2).attributeValue("value");//7. 使用反射創建對象.=> 回顧反射機制Class<?> aClass = Class.forName(classFullPath);//這里o對象就是Monster對象Monster o = (Monster) aClass.newInstance();//給o對象賦值o.setMonsterId(monsterId);o.setName(name);o.setSkill(skill);//8. 將創建好的對象放入到singletonObjectssingletonObjects.put(id, o);}public Object getBean(String id) {return singletonObjects.get(id);}
}

(3)創建main類測試

package com.spring;import com.spring.bean.Monster;
import com.spring.wwjApplicationContext.WwjApplicationContext;public class AppMain {public static void main(String[] args) throws Exception {WwjApplicationContext ioc = new WwjApplicationContext("beans.xml");Monster monster01 = (Monster)ioc.getBean("monster01");System.out.println("monster01 = " + monster01);}
}

運行結果:

6?Spring 原生容器底層結構

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

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

相關文章

jni 返回二維byte數組

在JNI中返回二維byte數組&#xff0c;你需要在Java中準備一個相應的二維數組來接收這個返回值。在JNI層面&#xff0c;你可以創建一個二維的byte數組&#xff0c;并使用GetByteArrayRegion和SetByteArrayRegion來操作它。 以下是一個簡單的例子&#xff1a; public class Jni…

基于STC12C5A60S2系列1T 8051單片機實現一主單片機與一從單片機進行雙向串口通信功能

基于STC12C5A60S2系列1T 8051單片機實現一主單片機與一從單片機進行雙向串口通信功能 STC12C5A60S2系列1T 8051單片機管腳圖STC12C5A60S2系列1T 8051單片機串口通信介紹STC12C5A60S2系列1T 8051單片機串口通信的結構基于STC12C5A60S2系列1T 8051單片機串口通信的特殊功能寄存器…

QT---day5,通信

1、思維導圖 2、TCp 服務器 #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> #include <QTcpServer> #include <QList> #include <QTcpSocket> #include <QMessageBox> #include <QDebug> #include <QTcpServer> QT_B…

鐳速實現利用Libarchive實現高效、智能的文件傳輸和管理

在前一篇報道中&#xff0c;我們闡述了Libarchive這一開源庫的強大功能&#xff0c;它專門用于處理歸檔文件。通過整合Libarchive&#xff0c;鐳速在包括Windows和Linux在內的多個操作系統上提供了在線解壓縮服務&#xff0c;為企業構建了一個既強大又安全的文件傳輸系統&#…

【代碼分享】使用HTML5的Canvas繪制編碼說明圖片

最急在工作中遇到一個需求&#xff0c;根據給定的編碼生成編碼說明&#xff0c;像下面這樣的效果。 不同含義的編碼用橫杠分割&#xff0c;然后每個編碼下面用箭頭指明具體的含義。下面是我使用canvas實現的代碼。具體的編碼寬度大家可以根據實際情況進行調整&#xff0c;目前…

Ranger 面試題及答案整理,最新面試題

Ranger 的安全模型是如何設計的&#xff1f; Ranger的安全模型設計主要基于訪問控制和安全策略的管理&#xff0c;它通過以下幾個關鍵組件實現&#xff1a; 1、策略管理&#xff1a; Ranger 提供了一個中央管理平臺&#xff0c;用于定義、更新和管理安全策略。這些策略根據資…

基于RT-Thread的HC-SR04超聲波驅動

前言 本次驅動用的是這款超聲波&#xff0c;超聲波的驅動大同小異&#xff0c;均可參考 一、引腳定義 引腳功能VCC接直流5V電TRIG接外部電路的TRIG端&#xff0c;向此引腳輸入10us以上的高電平可觸發超聲波測距ECHO接外部電路的ECHO端&#xff0c;測距結束時該引腳會輸出一…

Python框架Django入門教程

Django 是一個使用 Python 編程語言開發的、免費且開源的 Web 應用框架。它遵循 "DRY&#xff08;Dont Repeat Yourself&#xff09;" 原則&#xff0c;旨在簡化創建功能豐富的、高效率的 Web 網站。Django 提供了模型-視圖-控制器&#xff08;MVC&#xff09;架構的…

時尚圈的節制美學 — 奧柔拉 AVRALA的獨特設計理念

在這個多元化的時代&#xff0c;女性正在經歷一場前所未有的角色變革。她們不再僅僅滿足于傳統的社會角色&#xff0c;而是勇敢地追求個人職業發展和自我實現。在這樣的背景下&#xff0c;服飾不僅僅是外在的裝飾&#xff0c;更是內心故事的講述者、個性自我的表達者、身份歸屬…

KaiOS Data PDN 數據建立流程

代碼邏輯 APN創建 在 DataCallManager.jsm中,會對所有apnsetting創建一個datacall,其中會包含dataprofile的成員(通過apn參數來創建),在之后的流程用于直接發送到modem建立PDN。 PDN建立 1、DataCallManager.jsm -dcInterface.setupDataCall //RILNetworkInterface.c…

C語言內存泄漏及檢測方法

目錄 1. 內存泄漏概述 1.1 內存泄漏定義 1.2 內存泄漏的危害 1.3 內促泄漏的原因 2. C語言中的內存管理 2.1 C語言內存分配方式 2.2 C語言內存管理函數 2.3 動態內存管理注意事項 3. 內存泄漏的檢測與定位 3.1 內存泄漏檢測工具 3.2 內存泄漏定位方法 3.3 內存泄漏…

NX/UG二次開發—3D幾何—多邊形內部最大圓

多邊形內部最大圓&#xff0c;為什么不能說最大內切圓&#xff1f;如果正方形或正凸多邊形&#xff0c;最大內部圓是與邊相切的&#xff0c;但對于不規則多邊形&#xff0c;很多情況是正好經過一些凹點。 本次介紹在NX中計算封閉邊界內部最大圓&#xff1a; 1、首先按順序排序…

Spring、SpringMVC

一、Spring框架中的單例Bean是線程安全的嗎&#xff1f; 【默認單例的情況下】Spring Bean并沒有可變的狀態&#xff08;如Service類和DAO類&#xff09;&#xff0c;即只能查不能改&#xff0c;所以沒有并發問題&#xff0c;所以某種程度上來說Spring的單例Bean是線程安全的。…

【ZZULI數據結構實驗】壓縮與解碼的鑰匙:赫夫曼編碼應用

&#x1f4c3;博客主頁&#xff1a; 小鎮敲碼人 &#x1f49a;代碼倉庫&#xff0c;歡迎訪問 &#x1f680; 歡迎關注&#xff1a;&#x1f44d;點贊 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任爾江湖滿血骨&#xff0c;我自踏雪尋梅香。 萬千浮云遮碧…

Faiss原理及使用總結

Faiss&#xff08;Facebook AI Similarity Search&#xff09;是一個用于高效相似性搜索和密集向量聚類的庫。 一、原理 向量表示與相似度度量&#xff1a;在Faiss中&#xff0c;數據通常被表示為高維向量&#xff0c;這些向量可以來自深度學習模型的特征提取&#xff0c;也可…

2024-05-11 問AI:在深度學習中,學習率是什么

文心一言 在深度學習中&#xff0c;**學習率&#xff08;Learning Rate&#xff09;**是一個非常重要的超參數&#xff0c;它控制著模型在訓練過程中參數更新的步長。具體來說&#xff0c;學習率決定了在每次迭代&#xff08;或稱為一個epoch&#xff09;中&#xff0c;模型根…

前端工程化之包管理器

這里寫目錄標題 什么是包包管理工具常用的包管理工具npmnpm 基本使用初始化搜索工具包下載安裝包導入 npm 包基本流程生產依賴與開發依賴全局安裝安裝全部依賴安裝指定版本的包刪除依賴包 cnpm全局安裝nrm 的使用 yarn全局安裝yarn 常用命令 pnpm 【推薦使用】全局安裝 什么是包…

我國吻合器市場規模不斷擴大 國產化率有所增長

我國吻合器市場規模不斷擴大 國產化率有所增長 吻合器是替代手工切除或縫合的一種醫療器械&#xff0c;其工作原理與訂書機十分相似&#xff0c;可利用鈦釘對組織進行離斷或吻合。經過多年發展&#xff0c;吻合器種類逐漸增多&#xff0c;根據手術方式不同&#xff0c;吻合器大…

【JavaEE 初階(三)】多線程代碼案例

?博主主頁: 33的博客? ??文章專欄分類:JavaEE?? &#x1f69a;我的代碼倉庫: 33的代碼倉庫&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;關注我帶你了解更多線程知識 目錄 1.前言2.單例模式2.1餓漢方式2.2餓漢方式 3.阻塞隊列3.1概念3.2實現 4.定時器4.1概念4.…