裝配:建立應用元件(對象)之間的協作的行為,這也是Spring依賴注入(DI)的本質。
Spring提供了三種裝配機制:
- 隐式的自動裝配bean;
- 通過java代碼裝配bean(顯示);
- 通XML中裝配bean;
本文隻介紹第一種裝配方式:自動裝配。
在**《Spring實戰》**這本書中将自動裝配分為了兩個部分(元件掃描和自動裝配):
元件掃描:Spring會自動發現應用上下文(Spring容器)中所建立的bean;
自動裝配:Spring自動滿足bean之間的依賴。
我個人對Spring自動裝配的簡單了解就是通過 注解 的方式來實作Spring自動裝配的配置,進而在編譯或運作時實作bean的自動裝配。是以有幾個注解在這裡必需掌握。
- @Component(“cdPlayer”) : 表明該類作為元件類,并告知Spring需要為這個類建立bean,而且會配置設定一個預設的ID,ID名與類名相同首字母小寫。也可以自己設定ID,例如cdPlayer。
-
@ComponentScan (“soundsystem”):該注解用于配置類的配置,預設會掃描與配置類相同的包中帶有@Component注解的類,并在Spring中自動為其建立一個bean。
可以通過 (“soundsystem”)、basePackages屬性或basePackagesClasses屬性來設定掃描的(一個或多個)基礎包。
- @Configuration:用于定義配置類,被注解的類内部包含有一個或多個被**@Bean**注解的方法。
- @Bean:該注解一般用于修飾方法,告訴Spring這個方法傳回一個對象,該對象注冊為Spring應用上下文中的bean。(該注解在通過java程式配置bean的方式中會用到 )
- @ContextConfiguration(classes=CDPlayerConfiger.class):告訴spring需要在哪個配置類中加載配置;其中classes屬性為配置類的(.class),複數形式表示可以有多個配置類。
- @Autowired:可以對成員變量、方法和構造函數進行标注,根據類型來完成自動裝配注入的工作。
以上就是在Spring自動裝配的學習中遇到的注解。
下面是自動裝配的代碼:
jar包
其中beans、context、core、expression為4個核心包和一個 logging的jar包,這5個包構成最小的基本單元。用這5個包可以編寫一個Spring的hello world的程式;
其餘的jar包也是本次測試所必須的。
1、建立bean:
//接口
public interface CompactDisc {
void play();
}
import org.springframework.stereotype.Component;
@Component("firstSpring")
//表明該類作為元件類,并告知Spring為這個類建立bean, ID:firstSpring
public class SgtPeppers implements CompactDisc {
private String title = "Sgt.Pepper's Lonely Hearts Club Band";
private String artist = "The Beatles";
@Override
public void play() {
System.out.println("Playing "+title+" by "+artist);
}
}
2、配置類
@Configuration
@ComponentScan ("soundsystem")
// 該注解能夠在spring中啟用組建的元件掃描,預設會掃描與配置類相同的包
/ /自動裝配,類中可以沒有代碼。
public class CDPlayerConfiger {
}
3、自動裝配
@Component("cdPlayer") //該類也應設定為元件類,以便測試時将bean注入到測試代碼中
public class CDPlayer {
private CompactDisc cd;
@Autowired
//該注解表明Spring建立CDPlayer bean的時候,會通過構造器來執行個體化,并傳入一個CompactDisc類型的bean
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
public void play() {
cd.play();
}
}
4、驗證
運作兩個@Test方法 ,成功則表明自動裝配成功。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfiger.class)
public class CDPlayerTest {
@Rule
public final StandardOutputStreamLog log = new StandardOutputStreamLog();
@Autowired // 自動将 CompactDisc 類型的bean對象注入
private CompactDisc cd;
@Autowired // 自動将 CDPlayer 類型的bean對象注入
private CDPlayer player;
@Test // 測試 屬性cd是否為null
//不為null則Spring能夠發現CompactDisc類,并自動在上下文中将其建立為bean并注入到測試代碼中
public void cdShouldNotBeNull(){
assertNotNull(cd);
}
@Test
public void play(){
player.play();
assertEquals("Playing Sgt.Pepper's Lonely Hearts Club Band" +
" by The Beatles\r\n",log.getLog());
}
}
5、在main函數中調用
public class Main {
public static void main(String args[]){
//1、建立Spring的IOC容器的上下文對象
// 這裡傳入的參數為配置檔案的class 檔案
ApplicationContext acx = new AnnotationConfigApplicationContext(CDPlayerConfiger.class);
//2、從IOC的容器中擷取Bean的執行個體
CDPlayer cdPlayer = (CDPlayer) acx.getBean("cdPlayer");
cdPlayer.play();
}
}