1. 程式人生 > >筆記3 裝配Bean總結

筆記3 裝配Bean總結

對象 PE junit4 我們 總結 tex esc ted OS

一、自動化裝配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總結