Spring 中裝配 bean 的三種主要方式:java
建議儘量使用自動化配置,以免顯式配置所帶來的維護成本。
Spring 從兩個角度來實現自動化裝配:spring
爲了展現自動化配置,咱們先定義一個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 { }
簡單來講,自動裝配就是讓 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 進行自動裝配。
有些時候你想要將第三方庫中的組件裝配到你的應用中,在這種狀況下,是沒有辦法在它的類上添加 @Component 和 @Autowired 註解的,所以就不能使用自動化裝配的方案了。
@Configuration//代表這個類是一個配置類 public class CDPlayerConfig { }
@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 配置,在完成新的 Spring 工做時,但願你會使用自動化配置和 JavaConfig。
使用idea新建XML Spring Congfig配置文件便可。
<bean id="compactDisc" class="com.soundsystem.SgtPeppers" />
建立這個 bean 的類經過 class 屬性來指定的,而且要使用全限定的類名。
藉助id屬性,爲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>
@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); } }
使用@ImportResource("classpath:"):
@Configuration @Import(CDConfig.class) @ImportResource("classpath:") public class CDPlayerConfig { @Bean public CDPlayer cdPlayer(CompactDisc compactDisc){ return new CDPlayer(compactDisc); } }
<?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>