Spring裝配bean

Spring 中裝配 bean 的三種主要方式:java

  • 自動化配置
  • 基於 Java 的顯式配置
  • 基於 XML 的顯式配置

自動化配置

建議儘量使用自動化配置,以免顯式配置所帶來的維護成本。
Spring 從兩個角度來實現自動化裝配:spring

  • 組件掃描:Spring會自動發現應用上下文中所建立的bean。
  • 自動裝配:Spring自動知足bean之間的依賴。

建立可被發現的 bean

爲了展現自動化配置,咱們先定義一個CD的接口:ide

package com.soundsystem;  
  
public interface CompactDisc {  
    void play();  
}

建立一個CD接口的實現類————SgtPeppers:ui

package com.soundsystem;  
  
import org.springframework.stereotype.Component;  
//@Componet("lonelyHeartsClub") 爲bean明明,不然默認爲sgtPeppers,也就是將類名的第一個字母變爲小寫。  
@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);  
    }  
}

@Component這個簡單的註解代表該類會做爲組件類,並告知 Spring 要爲這個類建立 bean。沒有必要顯式配置 SgtPeppersbean,由於這個類使用了 @Component 註解,因此 Spring 會爲你把事情處理穩當。 this

不過,組件掃描默認是不啓用的。咱們還須要顯式配置一下 Spring,從而命令它去尋找帶有 @Component 註解的類,併爲其建立 bean。idea

@ComponentScan 註解開啓組件掃描,Spring 將會掃描這個包以及這個包下的全部子包,查找帶有 @Component 註解的類,併爲其建立 bean:spa

package com.soundsystem;  
  
import org.springframework.context.annotation.\*;
@Configuration//代表這個類是一個配置類
@ComponentScan//
public class CDPlayerConfig {
}

爲組件掃描命名

若是沒有爲bean顯示命名,不然默認爲sgtPeppers,也就是將類名的第一個字母變爲小寫。code

@Componet("lonelyHeartsClub")  
public class SgtPeppers implements CompactDisc {  
}

設置組件掃描的基礎包

開啓組件掃描,Spring 將會默認掃描這個包以及這個包下的全部子包。
能夠用basePackages屬性指定包名:xml

@Configuration
@ComponentScan(basePackages={"soundsystem",  "video"})
public class CDPlayerConfig  {  }

除了將包設置爲簡單的 String 類型以外,@ComponentScan 還提供了另一種方法,那就是將其指定爲包中所包含的類或接口:接口

@Configuration
@ComponentScan(basePackageClasses={CDPlayer.class, DVDPlayer.clas})
public class CDPlayerConfig  {  }

經過爲 bean 添加註解實現自動裝配

簡單來講,自動裝配就是讓 Spring 自動知足 bean 依賴的一種方法,在知足依賴的過程當中,會在 Spring 應用上下文中尋找匹配某個 bean 需求的其餘 bean。爲了聲明要進行自動裝配,咱們能夠藉助 Spring 的 @Autowired 註解。

比方說,將唱片注入播放器:

package com.soundsystem;  
  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.beans.factory.annotation.Value;  
import org.springframework.stereotype.Component;~~~~
@Component  
public class CDPlayer implements MediaPlayer {  
  
  private CompactDisc cd;  
  
  @Autowired(required = false)  
  public CDPlayer(CompactDisc cd){  
        this.cd = cd;  
  }  
  public void play() {  
  }  
}

它的構造器上添加了 @Autowired 註解,這代表當 Spring 建立 CDPlayerbean 的時候,會經過這個構造器來進行實例化而且會傳入一個可設置給 CompactDisc 類型的 bean,將一個 CompactDisc 注入到 CDPlayer 之中。
若是沒有匹配的 bean,那麼在應用上下文建立的時候,Spring 會拋出 一個異常。爲了不異常的出現,你能夠將 @Autowired 的 required 屬性設置爲 false。

若是有多個 bean 都能知足依賴關係的話,Spring 將會拋出一個異常,代表沒有明確指定要選擇哪一個 bean 進行自動裝配。

經過 Java 代碼裝配 bean

有些時候你想要將第三方庫中的組件裝配到你的應用中,在這種狀況下,是沒有辦法在它的類上添加 @Component 和 @Autowired 註解的,所以就不能使用自動化裝配的方案了。

建立配置類

@Configuration//代表這個類是一個配置類    
public class CDPlayerConfig {  

}

聲明bean

@Configuration//代表這個類是一個配置類    
public class CDPlayerConfig {  
    //@Bean(name="lonelyHeartsClubBand")這樣能夠給bean顯示命名 
    @Bean
    public CompactDisc sgtPeppers(){  
        return new SgtPeppers();  
    }
}

@Bean這代表這個方法會建立一個 bean 實例並將其註冊到 Spring 應用上下文中。

實現注入

@Configuration//代表這個類是一個配置類    
public class CDPlayerConfig {  
    //@Bean(name="lonelyHeartsClubBand")這樣能夠給bean顯示命名 
    @Bean
    public CompactDisc sgtPeppers(){  
        return new SgtPeppers();  
    }
    //將CompactDisc 注入到 CDPlayer 之中
    @Bean  
    public CDPlayer cdPlayer(){  
        return new CDPlayer(sgtPeppers());  
    }
}

經過 XML 裝配 bean

這只是用來幫助你維護已有的 XML 配置,在完成新的 Spring 工做時,但願你會使用自動化配置和 JavaConfig。

建立XML配置規範

使用idea新建XML Spring Congfig配置文件便可。

聲明一個簡單的<bean>

<bean id="compactDisc" class="com.soundsystem.SgtPeppers" />

建立這個 bean 的類經過 class 屬性來指定的,而且要使用全限定的類名。
藉助id屬性,爲bean命名。

藉助構造器注入初始化 bean

構造器注入 bean 引用

<bean id="cdPlayer" class="com.soundsystem.CDPlayer">  
    <constructor-arg ref="compactDisc" />  
</bean>

將字面量注入到構造器中

<bean id="compactDisc" class="com.soundsystem.BlankDisc"> 
    <constructor-arg index="0" value="Sgt. Pepper's Lonely Hearts Club Band"/>  
    <constructor-arg index="1" value="The Beatles"/>  
</bean>

裝配集合

<bean id="compactDisc" class="com.soundsystem.BlankDisc">  
    <constructor-arg index="0" value="Sgt. Pepper's Lonely Hearts Club Band"/>  
    <constructor-arg index="1" value="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>  
            <!-- ...other tracks omitted for brevity... --> 
        </list>  
    </constructor-arg>  
  
    <!-- 實現 bean 引用列表的裝配 --> 
    <constructor-arg>  
        <list>  
            <ref bean="compactDisc" />  
        </list>  
    </constructor-arg>  
</bean>

導入和混合配置

將一個JavaConfig配置中拆成多個

@Configuration  
public class CDConfig {  
  @Bean
  public CompactDisc sgtPeppers(){  
        return new SgtPeppers();  
    }  
}

使用@Import註解導入DConfig.class配置:

@Configuration
@Import(CDConfig.class)  
public class CDPlayerConfig {  
    @Bean  
  public CDPlayer cdPlayer(CompactDisc compactDisc){  
        return new CDPlayer(compactDisc);  
    }  
}

在 JavaConfig 中引用 XML 配置

使用@ImportResource("classpath:"):

@Configuration
@Import(CDConfig.class)  
@ImportResource("classpath:")
public class CDPlayerConfig {  
    @Bean  
  public CDPlayer cdPlayer(CompactDisc compactDisc){  
        return new CDPlayer(compactDisc);  
    }  
}

在 XML 配置中引用 JavaConfig

<?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">

<!--導入javaConfig配置-->
<bean class="com.soundsystem.CDPlayerConfig" />
<!--導入其餘xml配置-->
<import resource="cdplayer-config.xml"  />

</beans>
相關文章
相關標籤/搜索