chapter02_裝配Bean_裝配Bean

  • 依賴注入

    對(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末明垢,一起剝皮案震驚了整個(gè)濱河市蚣常,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌痊银,老刑警劉巖抵蚊,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贞绳,警方通過(guò)查閱死者的電腦和手機(jī)谷醉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冈闭,“玉大人俱尼,你說(shuō)我怎么就攤上這事∥埽” “怎么了遇八?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耍休。 經(jīng)常有香客問(wèn)我刃永,道長(zhǎng),這世上最難降的妖魔是什么羊精? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任斯够,我火速辦了婚禮,結(jié)果婚禮上喧锦,老公的妹妹穿的比我還像新娘读规。我一直安慰自己,他們只是感情好裸违,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布掖桦。 她就那樣靜靜地躺著,像睡著了一般供汛。 火紅的嫁衣襯著肌膚如雪枪汪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,488評(píng)論 1 302
  • 那天怔昨,我揣著相機(jī)與錄音雀久,去河邊找鬼。 笑死趁舀,一個(gè)胖子當(dāng)著我的面吹牛赖捌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矮烹,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼越庇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了奉狈?” 一聲冷哼從身側(cè)響起卤唉,我...
    開(kāi)封第一講書(shū)人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎仁期,沒(méi)想到半個(gè)月后桑驱,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體竭恬,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年熬的,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了痊硕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡押框,死狀恐怖岔绸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情强戴,我是刑警寧澤亭螟,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布挡鞍,位于F島的核電站骑歹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏墨微。R本人自食惡果不足惜道媚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翘县。 院中可真熱鬧最域,春花似錦、人聲如沸锈麸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)忘伞。三九已至薄翅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間氓奈,已是汗流浹背翘魄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舀奶,地道東北人暑竟。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像育勺,于是被迫代替她去往敵國(guó)和親但荤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容