Spring學習 反轉控制 與 依賴注⼊
1、 反轉(轉移)控制(IOC Inverse of Control)
1、控制:對於成員變量賦值的控制權
2、反轉控制:把對於成員變量賦值的控制權,從代碼中反轉(轉移)到Spring⼯⼚和配置⽂件中完成
3、 好處:解耦合
4、底層實現:⼯⼚設計模式
2、 依賴注⼊ (Dependency Injection DI)
1、注⼊:通過Spring的⼯⼚及配置⽂件,爲對象(bean,組件)的成員變量賦值
2、依賴注⼊:當⼀個類需要另⼀個類時,就意味着依賴,⼀旦出現依賴,就可以把另⼀個類作爲本類的成員變量,最終通過Spring配置⽂件進⾏注⼊(賦值)。
3、 好處:解耦合
3、Spring⼯⼚創建複雜對象
1、 什麼是複雜對象
複雜對象:指的就是不能直接通過new構造⽅法創建的對象
比如: Connection、 SqlSessionFactory
2、Spring⼯⼚創建複雜對象的3種⽅式
2.1 FactoryBean接⼝
開發步驟
實現FactoryBean接⼝
Spring配置⽂件的配置
# 如果Class中指定的類型 是FactoryBean接⼝的實現類,那麼通過id值獲得的是這個類所創建的複雜對象Connection
<bean id="conn" class="com.baizhiedu.factorybean.ConnectionFactoryBean"/>
細節
如果就想獲得FactoryBean類型的對象ctx.getBean("&conn") 獲得就是ConnectionFactoryBean對象
isSingleton⽅法 返回 true 只會創建⼀個複雜對象
返回 false 每⼀次都會創建新的對象
問題:根據這個對象的特點 ,決定是返回true(SqlSessionFactory) 還是 false (Connection)
mysql⾼版本連接創建時,需要制定SSL證書,
解決問題的⽅式
url ="jdbc:mysql://localhost:3306/suns?useSSL=false"
依賴注⼊的體會(DI)
把ConnectionFactoryBean中依賴的4個字符串信息 ,進⾏配置⽂件的注⼊
好處:解耦合
<bean id="conn" class="com.baizhiedu.factorybean.ConnectionFactoryBean">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/suns?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</bean>
FactoryBean的實現原理[簡易版]
接⼝回調
1. 爲什麼Spring規定FactoryBean接⼝實現 並且 getObject()?
2. ctx.getBean("conn") 獲得是複雜對象 Connection ⽽沒有 獲得ConnectionFactoryBean(&)
Spring內部運⾏流程
1. 通過conn獲得ConnectionFactoryBean類的對象 ,進⽽通過instanceof 判斷出是FactoryBean接⼝的實現類
2. Spring按照規定 getObject() --->Connection
3. 返回Connection
FactoryBean總結
Spring中⽤於創建複雜對象的⼀種⽅式,也是Spring原⽣提供的,後續講解Spring整
合其他框架,⼤量應⽤FactoryBean
2.2 實例⼯⼚
- 避免Spring框架的侵⼊
- 整合遺留系統
開發步驟
<bean id="connFactory" class="com.baizhiedu.factorybean.ConnectionFactory"></bean>
<bean id="conn" factorybean="connFactory" factorymethod="getConnection"/>
2.3 靜態⼯⼚
開發步驟
<bean id="conn" class="com.baizhiedu.factorybean.StaticConnectionFactory" factorymethod="getConnection"/>
4、控制Spring⼯⼚創建對象的次數
1、如何控制簡單對象的創建次數
<bean id="account" scope="singleton|prototype" class="xxxx.Account"/>
sigleton:只會創建⼀次簡單對象 默認值
prototype:每⼀次都會創建新的對象
2、如何控制複雜對象的創建次數
FactoryBean{
isSingleton(){
return true 只會創建⼀次
return false 每⼀次都會創建新的
}
}
如沒有isSingleton⽅法 還是通過scope屬
性 進⾏對象創建次數的控制
3、爲什麼要控制對象的創建次數?
好處:節省不別要的內存浪費
什麼樣的對象只創建⼀次?
- SqlSessionFactory
- DAO
- Service
什麼樣的對象 每⼀次都要創建新的?
- Connection
- SqlSession | Session
- Struts2 Action