-
依賴注入
對(duì)象的依賴關(guān)系由系統(tǒng)中負(fù)責(zé)協(xié)調(diào)各個(gè)對(duì)象的第三方組件(Spring)在創(chuàng)建時(shí)進(jìn)行設(shè)定舱呻。一個(gè)對(duì)象只通過(guò)接口來(lái)表明依賴關(guān)系,對(duì)象會(huì)在運(yùn)行期被賦予它們所依賴的對(duì)象芹务,而不需要主動(dòng)獲得
-
裝配
(1) 定義
創(chuàng)建應(yīng)用對(duì)象之間的協(xié)作關(guān)系
(2) 裝配機(jī)制
1 自動(dòng)
2 Java Config 配置類
3 Xml
(3) 優(yōu)先級(jí)
自動(dòng) > Java Config > Xml 配置, 現(xiàn)實(shí)條件不允許時(shí)再使用后面的方式
-
自動(dòng)配置 = 自動(dòng)掃描 + 自動(dòng)裝配
(1) 自動(dòng)掃描
@Component 注解會(huì)告知 Spring 為當(dāng)前類創(chuàng)建 bean
示例
import org.springframework.stereotype.Component; @Component public class SgtPeppers implements CompactDisc { private String title = "Sgt. Pepper's Lonely Hearts Club Band"; private String artist = "The Beatles"; public void play() { System.out.println("Playing " + title + " by " + artist); } }
@ComponentScan會(huì)進(jìn)行自動(dòng)掃描(默認(rèn)掃描當(dāng)前包下的bean概作,也可以進(jìn)行配置)
示例
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan public class CDPlayerConfig { }
自動(dòng)掃描也可以在Xml中通過(guò)配置實(shí)現(xiàn)
示例
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:c="http://www.springframework.org/schema/c" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="soundsystem" /> </beans>
@Configuration 代表該類是一個(gè)配置類
(2) 自動(dòng)裝配
@Autowired可以進(jìn)行自動(dòng)裝配田度,并且可以用在類的任何方法上,只要該方法存在不同對(duì)象的依賴關(guān)系
示例
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class CDPlayer implements MediaPlayer { private CompactDisc cd; @Autowired public CDPlayer(CompactDisc cd) { this.cd = cd; } public void play() { cd.play(); } }
-
Java Config 配置
(1) Java Config 一般放在單獨(dú)的包中樟氢,不包含任何業(yè)務(wù)邏輯
(2) 使用 @Configuration 代表該類是一個(gè)配置類
示例
@Configuration public class CDPlayerConfig { .... }
(3) 在JavaConfig中聲明Bean冈绊,需要編寫(xiě)一個(gè)方法,創(chuàng)建接口對(duì)應(yīng)的實(shí)例埠啃,然后給這個(gè)方法添加@Bean注解
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { @Bean public CompactDisc compactDisc() { return new SgtPeppers(); } @Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { return new CDPlayer(compactDisc); } }
(4) 默認(rèn)情況下死宣,Spring中的Bean都是單例的。也就是說(shuō)下面的例子中碴开,Spring會(huì)攔截對(duì) sgtPeppers()的調(diào)用并確保返回的是Spring所創(chuàng)建的bean
示例
@Bean public CDPlayer cdPlayer() { return new CDPlayer(sgtPeppers()); } @Bean public CDPlayer anotherCDPlayer() { return new CDPlayer(sgtPeppers()); }
(5) 帶有@Bean注解的方法可以采用任何必要的Java功能來(lái)產(chǎn)生示例毅该,未必是構(gòu)造器依賴注入
示例
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { CDPlayer cdPlayer = new CDPlayer(); cdPlayer.setCompactDisc(compactDisc); return cdPlayer; }
-
Xml裝配Bean
(1) 配置規(guī)范 + 根元素 <beans>
示例
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> ... </beans>
(2) 聲明bean: <bean>
示例
<bean class="soundsystem.SgtPeppers" id="compactDisc"/>
(3) 構(gòu)造器注入: <constructor-arg>
1 引用其他對(duì)象: ref屬性
示例
<bean id="cdPlayer" class="soundsystem.CDPlayer"> <constuctor-arg ref="compactDisc"/> </bean>
2 字面量: value屬性(按照構(gòu)造器的參數(shù)順序?qū)?yīng))
示例
<bean class="soundsystem.BlankDisc" id="blackDisc"> <constructor-arg value="Chara"/> <constructor-arg value="Glico"/> </bean>
3 集合:
<list>元素, <set>元素
(4) 設(shè)置屬性(類似于 setXXX方法): <property>,內(nèi)含 name屬性,代表 setXXX部分的XXX,但是首字母小寫(xiě)
1 引用其他對(duì)象: ref屬性
示例
<bean id="cdPlayer" class="soundsystem.CDPlayer"> <property name="compactDisc" ref="compactDisc"/> </bean>
2 字面量: value屬性(按照構(gòu)造器的參數(shù)順序?qū)?yīng))
示例
<bean class="soundsystem.BlankDisc" id="blackDisc"> <property name="artist" value="Chara"/> </bean>
3 集合:
<list>元素, <set>元素
(5) 原則:強(qiáng)相關(guān)使用構(gòu)造器,弱相關(guān)使用setXXX()方法
-
混合裝配
(1) Java Config 中引用 xml: @ImportResource注解
示例 (classpath是 src/main/resources)
@ImportResource("classpath:cd-config.xml")
(2) Java Config 中引用其他 Java Config: @Import
示例
@Configuration @Import(CDConfig.class, CDPlayerConfig.class) public class SystemConfig { }
所以潦牛,可以創(chuàng)建一個(gè) Java Config匯總配置類眶掌,這樣導(dǎo)入時(shí)只需要導(dǎo)入這個(gè)類
(3) xml 中引用 Java Config: 使用 <bean>元素
示例
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="compactDisc" class="soundsystem.BlankDisc" c:_0="Sgt. Pepper's Lonely Hearts Club Band" c:_1="The Beatles"> <constructor-arg> <list> <value>Sgt. Pepper's Lonely Hearts Club Band</value> <value>With a Little Help from My Friends</value> <value>Lucy in the Sky with Diamonds</value> <value>Getting Better</value> <value>Fixing a Hole</value> </list> </constructor-arg> </bean> </beans>
(4) xml 中引用其他 xml配置:<import>
示例 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <import resource="otherSource.xml"/> </beans>
-
測(cè)試時(shí),需要在 src/test/java 下創(chuàng)建 測(cè)試文件巴碗。
調(diào)用Java Config配置類使用 @ContextConfiguration(classes = xxx.class)
調(diào)用xml配置時(shí)使用 @ContextConfiguration(locations = "classpath:META-INF/spring/soundsystem.xml")
或者是 手動(dòng)地添加應(yīng)用上下文如 AnnotationConfigApplicationContext朴爬、ClassPathXmlApplicationContext等,詳見(jiàn)"Spring容器.md"
無(wú)論使用哪種配置良价,一般都要?jiǎng)?chuàng)建一個(gè)根配置寝殴,將所有的JavaConfig(自動(dòng)方式也有一個(gè)JavaConfig類)和XML組合起來(lái),然后這個(gè)根配置啟動(dòng) @ComponentScan
chapter02_裝配Bean_裝配Bean
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冈闭,“玉大人俱尼,你說(shuō)我怎么就攤上這事∥埽” “怎么了遇八?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耍休。 經(jīng)常有香客問(wèn)我刃永,道長(zhǎng),這世上最難降的妖魔是什么羊精? 我笑而不...
- 正文 為了忘掉前任斯够,我火速辦了婚禮,結(jié)果婚禮上喧锦,老公的妹妹穿的比我還像新娘读规。我一直安慰自己,他們只是感情好裸违,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布掖桦。 她就那樣靜靜地躺著,像睡著了一般供汛。 火紅的嫁衣襯著肌膚如雪枪汪。 梳的紋絲不亂的頭發(fā)上,一...
- 那天怔昨,我揣著相機(jī)與錄音雀久,去河邊找鬼。 笑死趁舀,一個(gè)胖子當(dāng)著我的面吹牛赖捌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矮烹,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼越庇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了奉狈?” 一聲冷哼從身側(cè)響起卤唉,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仁期,沒(méi)想到半個(gè)月后桑驱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竭恬,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年熬的,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痊硕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
- 正文 年R本政府宣布挡鞍,位于F島的核電站骑歹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏墨微。R本人自食惡果不足惜道媚,卻給世界環(huán)境...
- 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翘县。 院中可真熱鬧最域,春花似錦、人聲如沸锈麸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忘伞。三九已至薄翅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氓奈,已是汗流浹背翘魄。 一陣腳步聲響...
- 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像育勺,于是被迫代替她去往敵國(guó)和親但荤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 本章內(nèi)容: 聲明Bean 構(gòu)造器注入和Setter方法注入 裝配Bean 控制bean的創(chuàng)建和銷毀 任何一個(gè)成功的...
- ?著作權(quán)歸作者所有:來(lái)自51CTO博客作者優(yōu)秀android的原創(chuàng)作品涧至,如需轉(zhuǎn)載腹躁,請(qǐng)注明出處,否則將追究法律責(zé)任 ...
- 最近想系統(tǒng)的學(xué)習(xí)一下Spring的相關(guān)知識(shí)化借,在這里分享一下潜慎。也希望能幫助那些對(duì)英文技術(shù)文檔閱讀比較困難的朋友。接下...
- http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
- 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...