Spring入門(三):通過JavaConfig裝配bean

周偉偉的技術部落格發表於2019-03-06

上一篇部落格中,我們講解了使用元件掃描和自動裝配實現自動化裝配bean,這也是最好的使用方式。

但是某些場景下,我們可能無法使用自動裝配的功能,此時就不得不顯式的配置bean。

比如我們引用了一個第三方類庫,需要將類庫中的某個類裝配到專案中,我們不可能在該類上新增@Component註解,因此無法使用自動裝配的功能。

Spring中有以下兩種方式顯式配置bean:

  1. 通過JavaConfig配置bean
  2. 通過xml配置bean

本篇部落格主要講解下通過JavaConfig配置bean的實現方法,通過xml配置bean的實現方法後續再單獨寫一篇部落格。

我們還使用上一篇部落格中的例子,不過程式碼會做適當修改。

package soundsystem.javaconfig;

public interface CompactDisc {
    void play();
}
複製程式碼
package soundsystem.javaconfig;

public class SgtPeppers implements CompactDisc {

    @Override
    public void play() {
        String title = "Sgt.Pepper's Lonely Hearts Club Band";
        String artists = "The Beatles";
        System.out.println("Playing " + title + " By " + artists);
    }
}
複製程式碼
package soundsystem.javaconfig;

public class CDPlayer {

    private CompactDisc compactDisc;

    public CDPlayer(CompactDisc compactDisc) {
        this.compactDisc = compactDisc;
    }

    public void play() {
        compactDisc.play();
    }
}
複製程式碼

注意:和上一篇部落格相比,我們去掉了SgtPeppers類和CDPlayer類上的@Component註解。**

1.建立配置類

package soundsystem.javaconfig;

import org.springframework.context.annotation.Configuration;

@Configuration
public class CDPlayerConfig {
}
複製程式碼

2.宣告bean

在JavaConfig中,我們使用@Bean註解來宣告bean,如下所示:

package soundsystem.javaconfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDPlayerConfig {
    @Bean
    public CompactDisc sgtPeppers() {
        return new SgtPeppers();
    }
}
複製程式碼

預設生成的bean ID和方法名一致,即sgtPeppers,不過我們可以自定義:

@Bean(name = "lonelyHeartsClub")
public CompactDisc sgtPeppers() {
     return new SgtPeppers();
}
複製程式碼

上面宣告的bean比較簡單,沒有任何其它依賴,但是有些複雜的bean,比如CDPlayer,它依賴於CompactDisc,那我們該如何宣告呢?

簡單的一種方式是,直接使用剛剛定義的sgtPeppers()方法作為CDPlayer構造器的引數依賴:

@Bean
public CDPlayer cdPlayer() {
    return new CDPlayer(sgtPeppers());
}
複製程式碼

不過更建議的是以下方式,將依賴項作為bean方法的引數,Spring會自動匹配到引數依賴項:

@Bean
public CDPlayer cdPlayer(CompactDisc compactDisc) {
    return new CDPlayer(compactDisc);
}
複製程式碼

此時配置類的程式碼為:

package soundsystem.javaconfig;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDPlayerConfig {
    @Bean
    //@Bean(name = "lonelyHeartsClub")
    public CompactDisc sgtPeppers() {
        return new SgtPeppers();
    }

    /*@Bean
    public CDPlayer cdPlayer() {
        return new CDPlayer(sgtPeppers());
    }*/

    @Bean
    public CDPlayer cdPlayer(CompactDisc compactDisc) {
        return new CDPlayer(compactDisc);
    }
}
複製程式碼

3.驗證bean是否裝配成功

新建測試類CDPlayerTest:

package soundsystem.javaconfig;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class CDPlayerTest {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(CDPlayerConfig.class);
        CompactDisc compactDisc = (SgtPeppers) applicationContext.getBean("sgtPeppers");
        compactDisc.play();

        CDPlayer cdPlayer = applicationContext.getBean(CDPlayer.class);
        cdPlayer.play();
    }
}
複製程式碼

執行結果:

Spring入門(三):通過JavaConfig裝配bean
從執行結果可以看出,bean裝配成功。

4.原始碼地址

github.com/zwwhnly/Spr…,歡迎大家下載,有問題可以多多交流。

相關文章