學習視頻:【孫哥說Spring5:從設計模式到基本應用到應用級底層分析,一次深入淺出的Spring全探索。學不會Spring?只因你未遇見孫哥】 第七章、反轉控制與依賴註入 1.反轉(轉移)控制(IOC inverse of Control) 控制:對於成員變數賦值的控制權 反轉控制:把對於成員變數 ...
學習視頻:【孫哥說Spring5:從設計模式到基本應用到應用級底層分析,一次深入淺出的Spring全探索。學不會Spring?只因你未遇見孫哥】
第七章、反轉控制與依賴註入
1.反轉(轉移)控制(IOC inverse of Control)
-
控制:對於成員變數賦值的控制權
-
反轉控制:把對於成員變數賦值的控制權,從代碼中反轉(轉移)到Spring工廠和配置文件中。
好處:解耦合
-
底層實現:工廠設計模式
如果對工廠設計模式不熟悉,可以看看前面的從簡單工廠到通用工廠的筆記:Spring5的基本介紹、工廠設計模式
2.依賴註入(Dependency Injection Di)
-
註入:通過Spring的工廠及配置文件,為對象(bean、組件)的成員變數賦值
-
依賴註入:當一個類需要另一個類時,就意味著依賴,一旦出現依賴,就可以把另一個類作為本類的成員變數,最終通過Spring配置文件進行註入(賦值)
好處:解耦和
第八章、Spring工廠創建複雜對象
1.什麼是複雜對象
- 複雜對象:指的就是不能直接通過new構造方法創建的對象(Connection,SqlSessionFactory)
2.Spring工廠創建複雜對象的3種方式
2.1 FactoryBean介面
FactoryBean是Spring原生提供給我們創建複雜對象的方式,同時也是spring中一個非常重要的機制
-
開發步驟
- 實現FactoryBean介面
-
Spring配置文件的配置
如果Class中指定的類型 是FactoryBean介面的實現類,那麼通過id獲取的是這個類所創建的複雜對象。
class雖然指向ConnectionFactoryBean,但是ctx.getBean("conn")獲取的是Connection複雜對象。
<bean id=”conn” class=”com.baizhi.factorybean.ConnectionFactoryBean”/>
-
細節
-
如果只想獲得FactoryBean類型的對象
ConnectionFactoryBean conn = (ConnectionFactoryBean) ctx.getBean("&conn");
getBean的參數加上“&” -
isSingleton方法
返回true只會創建一個複雜對象
返回false每一次都會創建新的對象
問題:怎麼選擇? 根據這個對象的特點,決定是返回true還是false
-
mysql高版本連接創建時,需要指定ssl證書,在連接資料庫的url參數加上 useSSL=false即可解決。
-
依賴註入的體會
-
把Connection Factory Bean中依賴的4個字元串信息,進行配置文件的註入
好處:解耦合
<bean id="conn" class="com.baizhi.factorybean.ConnectionFactoryBean"> <property name="driveClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/myschool?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="123456"/> </bean>
-
-
-
FactoryBean的實現原理(簡易版)
- 介面回調
- 為什麼Spring規定FactoryBean介面 實現 並且 getObject()?
- ctx.getBean(”conn”)獲得是複雜對象 Connection,而沒有獲得ConnectionFactoryBean(&)
Spring內部運行流程
- 通過conn獲取ConnectionFactoryBean類的對象,進而通過instanceof判斷是FactoryBean介面的實現類
- Spring按照規定執行 getObject() ——>Connection
- 返回Connection
-
FactoryBean總結
Spring中用於創建複雜對象的一種方式,也是Spring原生提供的,後續講解Spring整合其他框架,會大量應用FactoryBean。
2.2 實例工廠
-
避免Spring框架的侵入
implements FactoryBean(是spring提供的,離開了FactoryBean,沒有能代替)
-
整合遺留系統(去到公司後,往往是整合遺留下來的代碼)
- 開發步驟
<!-- 2.獲取複雜對象 通過實例工廠-->
<bean id="connFactory" class="com.baizhi.factorybean.ConnectionFactory"/>
<bean id="conn" factory-bean="connFactory" factory-method="getConnection"/>
2.3 靜態工廠
- 開發步驟
<!--3. 獲取複雜對象 通過靜態工廠-->
<bean id="conn" class="xxx.StaticConnectionFactory" factory-method="getConnection"/>
3.Spring工廠創建對象的總結
第九章、控制Spring工廠創建對象的次數
1.如何控制簡單對象的創建次數
<bean id="account" scope="singleton | prototype" class="com.baizhi.scope.Account"></bean>
singleton:只會創建一次簡單對象 預設值
prototype:每一次都會創建新的對象
2.如何控制複雜對象的創建次數
FactoryBean{
isSingleton(){
return true 只會創建一次
return false 每一次創建新的
}
}
如沒有isSingleton方法 還是通過scope控制次數
3.為什麼要控制對象的創建次數?
- 好處:節省不必要的記憶體浪費(對象創建多次,記憶體會浪費掉)
- 什麼樣的對象只創建一次
- SqlSessionFactory
- DAO
- Service
- 什麼樣的對象每次都要創建新的
- Connection
- SqlSession | Session
作者:揚眉劍出鞘
出處: https://www.cnblogs.com/eyewink/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。