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

上一篇博客中,咱們講解了使用組件掃描和自動裝配實現自動化裝配bean,這也是最好的使用方式。java

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

好比咱們引用了一個第三方類庫,須要將類庫中的某個類裝配到項目中,咱們不可能在該類上添加@Component註解,所以沒法使用自動裝配的功能。github

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

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

本篇博客主要講解經過JavaConfig配置bean的實現方法,經過xml配置bean的實現方法後續再單獨寫一篇博客。微信

咱們還使用上一篇博客中的例子,不過代碼會作適當修改。app

package chapter02.javaconfig;

public interface CompactDisc {
    void play();
}
複製代碼
package chapter02.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 chapter02.javaconfig;

public class CDPlayer {

    private CompactDisc compactDisc;

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

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

注意:和上一篇博客相比,咱們去掉了SgtPeppers類和CDPlayer類上的@Component註解。ide

1. 建立配置類

package chapter02.javaconfig;

import org.springframework.context.annotation.Configuration;

@Configuration
public class CDPlayerConfig {
}
複製代碼

2. 聲明bean

在JavaConfig中,咱們使用@Bean註解來聲明bean,以下所示:測試

package chapter02.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,不過咱們能夠自定義:this

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

上面聲明的bean比較簡單,沒有任何其它依賴,可是有些複雜的bean,好比CDPlayer,它依賴於CompactDisc,那咱們該如何聲明呢?spa

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

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

不過更建議的是如下方式,將依賴項做爲bean方法的參數,Spring會自動匹配到參數依賴項:

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

此時配置類的代碼爲:

package chapter02.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 chapter02.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();
    }
}
複製代碼

運行結果:

從運行結果能夠看出,bean裝配成功。

4. 源碼及參考

源碼地址:github.com/zwwhnly/spr…,歡迎下載。

Craig Walls 《Spring實戰(第4版)》

最後,歡迎關注個人微信公衆號:「申城異鄉人」,全部博客會同步更新。

相關文章
相關標籤/搜索