Spring基本介紹
1.官方資料和下載
1.1Spring5下載
直接訪問 https://repo.spring.io/ui/native/release/org/springframework/spring/,選擇相應版本即可
-
進入官網 https://spring.io/
-
進入Spring5
-
進入Spring5 的github
也可以直接訪問 https://github.com/spring-projects/spring-framework
-
在github倉庫README.md檔案往下拉,看到Access to Binaries,點擊里面的鏈接
-
在新頁面往下拉,看到如下標題,點擊鏈接
-
點擊Artifacts
-
在左邊的彈窗中依次點擊release-->org-->springframework-->spring

-
在右邊的視窗點擊復制url
-
在瀏覽器新頁面訪問該地址,在頁面中即可選擇你想要下載的版本,我這里選擇下載5.3.8版本
-
點擊對應版本,在新頁面中選擇第一個,點擊即可下載
1.2Spring檔案
-
在線檔案
Spring Framework Documentation
-
離線檔案
解壓縮后,在\spring-framework-5.3.8\docs\reference目錄下分別提供了spring介紹檔案的html和pdf版本
-
離線API
在\spring-framework-5.3.8\docs\javadoc-api\index.html中可以查看Spring的API
2.Spring學習的核心內容
- Spring核心學習內容:IOC,AOP,JDBCTemplate
- IOC:控制反轉,可以管理java物件
- AOP:切面編程
- JDBCTemplate:是Spring提供的一套訪問資料庫的技術,應用性強,相對好理解
- 宣告式事務:基于ioc/aop實作事務管理
- 其中ioc,aop是重點以及難點
3.Spring幾個重要概念
- Spring可以整合其他的框架(Spring是管理框架的框架)
- Spring有兩個核心的概念:IOC 和 AOP
- IOC [Inversion Of Control 反轉控制]:
-
傳統的開發模式 [ JdbcUtils/反射 ]
程式------->環境 //程式讀取環境配置,然后自己創建物件
傳統的開發模式:(以連接到資料庫為例說明)
-
程式員撰寫程式,在程式中讀取資料庫配置資訊
-
創建物件(反射或者new)
各種物件,如:Connection,PreparedStatement,ResultSet等等
-
使用物件完成任務
-
-
IOC的開發模式
程式<------容器 //容器創建好物件,程式直接使用
如,現在有幾個類:EmpAction EmpService EmpDao Emp
傳統的方式是通過手動new創建物件,然后在程式中使用
現在,可以把要使用到的物件先配置到一個檔案中(xml或者注解,這里以xml配置為例),這個檔案可以理解成一個“容器檔案”,配置好后,當spring啟動以后,它就可以直接在程式中來獲取容器創建好的物件,并進行使用:
-
Spring根據組態檔xml/注解,創建物件,并放入到容器中(類似ConcurrentHashMap),并且可以完成物件之間的依賴(物件之間的依賴關系也在xml配置或者注解中完成)
依賴:即物件間的參考關系,例如有A,B兩個類,A類中的某個屬性是B類,通過容器創建的兩個類的物件a,b,它們之間的依賴/參考關系,將會自動完成(當然,也需要配置)
-
當需要使用某個物件實體時,直接從容器中獲取即可
-
這樣程式員可以更加專注于使用物件完成相應的業務
這樣創建物件的方式就從 new ===> 注解/配置方式
-
-
DI(Dependency Injection 依賴注入),可以理解成是IOC的另外叫法
-
Spring最大的價值:通過配置,給程式員提供需要使用的 web層[Servlet(Action/Controller)]/Service/Dao/JavaBean等物件,這是Spring的核心價值所在,也是ioc的具體體現,實作解耦
-
原先的開發模式,Servlet是tomcat創建的,然后Servlet中如果你要用什么物件實體(如Service),就new一個,在Service中你要使用什么實體(如Dao),也同樣是通過new的方式來創建實體……以此類推
-
當使用Spring以后,web層的Servlet,Service層,Dao層,Javabean[entity]中的所有物件,我們都可以在組態檔中配置(或者通過注解指定),并且指定好物件間的依賴關系,放入到容器中,當這個流程結束后,我們想在程式中使用哪個物件,都可以直接在容器中直接獲取,
-
4.Spring快速入門
4.1需求說明
通過Spring的方式[組態檔],獲取JavaBean:Monster的物件,并給該物件的屬性賦值,輸出該物件資訊
4.2完成步驟
-
下載spring 5 開發包
詳見1.1.1spring5下載
-
創建Java工程
為了清晰spring5 的各個jar包的作用,這里使用Java工程
-
新建一個lib檔案夾,引入開發spring5的基本包
commons-logging.jar包需要另外下載,不在spring5包中
4.3代碼實作
-
創建Javabean:Monster.java
package com.li.bean; /** * @author 李 * @version 1.0] * Javabean / Entity */ public class Monster { private Integer monsterId; private String name; private String skill; //無參構造器一定要有,spring底層反射創建物件時需要使用 public Monster() { } public Monster(Integer monsterId, String name, String skill) { this.monsterId = monsterId; this.name = name; this.skill = skill; } 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; } @Override public String toString() { return "Monster{" + "monsterId=" + monsterId + ", name='" + name + '\'' + ", skill='" + skill + '\'' + '}'; } } -
在src目錄下創建組態檔:滑鼠右擊src目錄--->new--->XML Configuration File--->Spring Config,我這里起名為beans.xml
-
創建好組態檔后,檔案上方顯示"Applilcation context not configured for this file",點擊右邊的Create Spring facet
在彈出的視窗中直接點擊右下方的ok
然后重新點擊檔案的Create Spring facet
在新視窗選中beans.xml檔案,然后點擊ok,之后檔案就不再提示了,

-
在beans.xml檔案中配置monster物件
<?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"> <!-- 1. 配置monster物件/javabean 2. 在 beans標簽中可以配置多個bean 3. 一個bean就是一個Javabean物件 4. class屬性用于指定類的全路徑->spring底層反射要用 5. id屬性表示該java物件在spring容器中的id(將來在程式中通過id在容器中獲取相應物件,因此id是唯一的) 6. <property name="monsterId" value="https://www.cnblogs.com/liyuelian/archive/2023/01/14/100"/> 用于給該物件的屬性賦值,沒有的話就是默認值 --> <bean id="monster01"> <property name="monsterId" value="https://www.cnblogs.com/liyuelian/archive/2023/01/14/100"/> <property name="name" value="https://www.cnblogs.com/liyuelian/archive/2023/01/14/牛魔王"/> <property name="skill" value="https://www.cnblogs.com/liyuelian/archive/2023/01/14/芭蕉扇"/> </bean> </beans> -
創建測驗類SpringBeanTest
package com.li.test; import com.li.bean.Monster; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.testng.annotations.Test; /** * @author 李 * @version 1.0 */ public class SpringBeanTest { @Test public 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.id=" + monster01.getMonsterId() + " monster01.name=" + monster01.getName() + " monster01.skill=" + monster01.getSkill()); //5.相比于強轉,也可以直接在獲取的時候指定Class型別 Monster monster011 = ioc.getBean("monster01", Monster.class); System.out.println("monster011=" + monster011); System.out.println("monster011.name=" + monster011.getName()); System.out.println("ok~~~"); } }
4.4注意事項和細節
4.4.1類加載路徑
一個問題:為什么下面可以讀取到beans.xml檔案?或者說,讀取的檔案是src目錄下的beans.xml嗎?
ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");
我們可以在測驗類中輸出一下路徑:
//驗證類加載路徑
@Test
public void classPath() {
File file = new File(this.getClass().getResource("/").getPath());
System.out.println("file=" + file);
}
可以看到類的加載路徑并不在src目錄,而是在一個out目錄下:
可以看到在out\production\spring目錄下有一個beans.xml檔案:
當運行后,會將src目錄下編譯好的class檔案放到out目錄下,同時,將資源檔案(這里指beans.xml)也放到out目錄,讀取的時候是按照out目錄來讀取的,
因此運行時,真正讀取的組態檔不是在src目錄下的beans.xml,而是在out目錄下的beans.xml,只是兩個檔案是一樣的,(類的加載路徑)
回到之前的問題,為什么下面的陳述句,我們直接寫“beans.xml”?
ApplicationContext ioc =new ClassPathXmlApplicationContext("beans.xml");
因為默認讀取的是.....\out\production\spring目錄,而一旦運行過后,在src目錄下的beans.xml檔案會被直接放在.....\out\production\spring目錄下,因此可以直接讀取到,
假如beans.xml檔案是放到src下面的某個子檔案夾,那么在陳述句中就要根據子檔案夾的結構來進行修改,
4.4.2spring容器的結構/機制
注意配置debugger,通過配置指定哪一些資料在debug的時候會展示,哪一些不展示
1.如下,打上斷點,點擊debug
2.如下,beanFactory的beanDefinitionMap屬性的型別是ConcurrentHashMap集合,保存beans.xml中的bean節點配置的bean物件的資訊
因為在我們的組態檔中,通常會有很多的java物件資訊,spring會把這些java物件的資訊保存下來,以便將來spring創建物件時使用
3.展開beanDefinitionMap物件,可以看到一個table陣列(ConcurrentHashMap型別),初始的大小為512,Spring會將java物件的資訊放到table中,
4.index=127位置以ConcurrentHashMap$Node型別保存Monster01物件資訊
其中key=“monster01”就是beans.xml中配置的bean的id
value存放了很多資料,例如:monster01物件的資訊(屬性,屬性值,類資訊,是否懶加載)
propertyValues就是記錄beans.xml中配置的monster01物件的屬性名和屬性值
5.此外beanFactory還有一個重要屬性singletonObjects,singletonObjects也是一個ConcurrentHashMap集合
....未完
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/541993.html
標籤:其他
上一篇:PHP實作動態修改.env檔案配置(適用于任何框架)
下一篇:java中的基本型別
