筆記3 裝配Bean總結
一、自動化裝配bean
1.組件掃描
2.自動裝配
CompactDisc.java
1 package Autowiring; 2 3 public interface CompactDisc { 4 void play(); 5 6 }
SgtPeppers.java
SgtPeppers類上使用了@Component註解。
這個簡單的註解表明該類會作為組件類,並告知Spring要為這個類創建bean。沒有必要顯式配置SgtPeppersbean,因為這個類使用了@Component註解,所以Spring會為你把事情處理妥當。
1 package Autowiring;2 3 import org.springframework.stereotype.Component; 4 5 @Component 6 public class SgtPeppers implements CompactDisc { 7 private String title = "Sgt. Pepper‘s Lonely Hearts Club Band"; 8 private String artist = "The Beatles"; 9 10 @Override 11 public void play() { 12 //TODO Auto-generated method stub 13 System.out.println("Playing " + title + " by " + artist); 14 } 15 16 }
不過,組件掃描默認是不啟用的。我們還需要顯式配置一下Spring,從而命令它去尋找帶有@Component註解的類,並為其創建bean。
1 package Autowiring; 2 3 import org.springframework.context.annotation.ComponentScan; 4 import org.springframework.context.annotation.Configuration;5 6 @Configuration 7 @ComponentScan 8 public class CDPlayerConfig { 9 10 }
通過Java代碼定義了Spring的裝配規則@ComponentScan默認會掃描與配置類相同的包。
因為CDPlayerConfig類位於Autowiring包中,因此Spring將會掃描這個包以及這個包下的所有子包,查找帶有@Component註解的類。
這樣的話,就能發現CompactDisc的實現類,並且會在Spring中自動為其創建一個bean。
測試
CDPlayerTest.java
1 package Autowiring; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.test.context.ContextConfiguration; 7 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 8 9 @RunWith(SpringJUnit4ClassRunner.class) 10 @ContextConfiguration(classes = Autowiring.CDPlayerConfig.class) 11 public class CDPlayerTest { 12 @Autowired 13 private CompactDisc cd; 14 15 @Test 16 public void test() { 17 cd.play(); 18 } 19 }
CDPlayerTest使用了Spring的SpringJUnit4ClassRunner,以便在測試開始的時候自動創建Spring的應用上下文。
註解@ContextConfiguration會告訴它需要在CDPlayerConfig中加載配置。因為CDPlayerConfig類中包含了@ComponentScan,因此最終的應用上下文中應該包含CompactDisc這個bean。在測試代碼中有一個CompactDisc類型的屬性,並且這個屬性帶有@Autowired註解,以便於將CompactDisc這個bean註入到測試代碼之中
二、通過Java代碼裝配Bean
CDPlayerConfig.java
1 package Javawiring; 2 3 import org.springframework.context.annotation.Bean; 4 import org.springframework.context.annotation.Configuration; 5 6 @Configuration 7 public class CDPlayerConfig { 8 9 @Bean 10 public CompactDisc randomBeatlesCD() { 11 int choice = (int) Math.floor(Math.random() * 4); 12 if (choice == 0) { 13 return new SgtPeppers(); 14 } else if (choice == 1) { 15 return new WhiteAlbum(); 16 } else if (choice == 2) { 17 return new HardDaysNight(); 18 } else { 19 return new Revolver(); 20 } 21 } 22 23 24 @Bean 25 public CDPlayer cdPlayer(CompactDisc randomBeatlesCD) { 26 return new CDPlayer(randomBeatlesCD); 27 } 28 }
@Configuration註解表明這個類是一個配置類 , 移除了@ComponentScan註解,此時的CDPlayerConfig類就沒有任何作用了。
聲明簡單的bean
1 @Bean 2 public CDPlayer cdPlayer(CompactDisc randomBeatlesCD) { 3 return new CDPlayer(randomBeatlesCD); 4 }
CDPlayer實現了一個接口,構造函數的參數是實現了CompactDisc接口的類,然後執行其相應的方法。
1 @Bean 2 public CompactDisc randomBeatlesCD() { 3 int choice = (int) Math.floor(Math.random() * 4); 4 if (choice == 0) { 5 return new SgtPeppers(); 6 } else if (choice == 1) { 7 return new WhiteAlbum(); 8 } else if (choice == 2) { 9 return new HardDaysNight(); 10 } else { 11 return new Revolver(); 12 } 13 }
三、通過XML裝配bean
聲明一個bean
1 <bean id="sgtPepperss" class="XMLwiring.SgtPepperss" ></bean>
測試的時候修改@ContextConfiguration("classpath:SoundSystemXMLwiring.xml"),然後定義相應的對象進行測試。
四、混合裝配
兩個Java配置文件,在一個總的配置文件中使用@Import({ CDConfig.class, CDPlayerConfig.class })進行結合。
1.在JavaConfig中引用XML配置 <@ImportResource註解>
@ImportResource("classpath:SoundSystemJavaXMLwiring.xml")
2.在XML配置中引用JavaConfig
將Java配置文件當作bean在XML文件中進行聲明即可。
筆記3 裝配Bean總結