spring的策略
- 基于pojo的輕量級和最小入侵性編程
- 通過依賴注入和面向接口實現松耦合
- 基于切面和慣例進行聲明式編程
- 通過切面和模板減少樣式代碼
何為依賴注入
簡單來說,任何一個應用都是有兩個或者兩個以上的類組成,這些類相互之間進行協作完成業務邏輯,通常,每個對象負責管理與自己相互協作的對象的引用,所謂依賴注入就是將這些對象的關聯交給容器,降低代碼的耦合度。依賴注入的最大優點就是松耦合
如何注入一個特定的bean
創建應用組件之間協作行為通常稱為裝配,spring有多種裝配bean的方式,基于xml是最常見的裝配方式。
spring 是如何工作的
spring通過應用上下文(ApplicationContext)裝載bean的定義并把它們組裝起來,spring應用上下文負責bean的創建和組裝。
一個簡單的demo實例:spring裝載管理bean
面向切面編程(AOP)
面向切面編程的目的就是把遍布應用在各處的功能分離出來形成可重用的組件
一個簡單的例子見上面^^^
裝配bean
- 使用構造器傳參
<bean id="jugger" class="com.yuxi.initbean.idol.Jugger">
// 需要注意這個構造函數必須要有
<constructor-arg value="15"/>
</bean>
- 構造器引用對象
<bean id="poemJugger" class="com.yuxi.initbean.idol.PoeticJugger">
<constructor-arg value="16"/>
// ref 引用對象
<constructor-arg ref="poem"/>
</bean>
<bean id="poem" class="com.yuxi.initbean.idol.Sonnet29"></bean>
- 通過工廠方法創建bean
在很多時候我們會使用單例,但是單例沒有構造函數,那么我們怎么辦?
<bean id="stage" class="com.yuxi.initbean.idol.single.init.Stage"
// 通過factory-method
factory-method="getInstance"/>
bean 的作用域
首先,需要說明的是,所有的spring bean 默認的都是單例的
在spring中管理bean的作用域的是:scope
scope類型有: singleton ,prototype,request,session,global-session
但是,我們經常使用的也就是singleton,prototype都很少使用。屬性注入
通過屬性注入bean
<bean id="instrumentList" class="com.yuxi.initbean.idol.properties.Instrumentlist">
//屬性注入
<property name="instrument" ref="piano"></property>
<property name="song" value="champions"/>
</bean>
<bean id="piano" class="com.yuxi.initbean.idol.properties.Piano"/>
最小化spring XML配置
- 自動裝配
有助于減少甚至消除配置<property>元素和<constructor-arg>元素,讓spring自動識別如何裝配bean的依賴關系 - 自動檢測
比自動裝配更進一步,讓spring能夠自動識別哪些類需要配置成springbean,從而減少對bean元素的使用
當自動裝配和自動檢測一起使用的時候會有神奇的效果,spring的XML文件會顯著的減少
spring的自動裝配策略:
- byName
把與bean的屬性具有相同名字或者ID的其他的bean自動裝配到bean對應的屬性中,如果沒有不進行裝配 - byType
把與bean的屬性具有相同類型的其他的bean自動裝配到bean的對應的屬性里,如果沒有不進行裝配 - constructor
把與bean的構造器入參具有相同類型的其他bean自動裝配到bean構造器對應入參中 - autodetect
首先嘗試使用constructor鏡像自動裝配,如果失敗按照byType
使用注解裝配
spring默認是禁止使用注解的需要設置開啟注解
<context:annotation-config/>
- @Autowired
- @Resource