天天看點

Spring學習之Spring三種裝配機制:(一)自動化裝配bean

裝配:建立應用元件(對象)之間的協作的行為,這也是Spring依賴注入(DI)的本質。

Spring提供了三種裝配機制:

  1. 隐式的自動裝配bean;
  2. 通過java代碼裝配bean(顯示);
  3. 通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包

Spring學習之Spring三種裝配機制:(一)自動化裝配bean

其中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();
    }
}