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


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

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

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

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

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

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

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

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注解。

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,不過我們可以自定義:

@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 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. 源碼及參考

源碼地址:https://github.com/zwwhnly/spring-action.git,歡迎下載。

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

原創不易,如果覺得文章能學到東西的話,歡迎點個贊、評個論、關個注,這是我堅持寫作的最大動力。

如果有興趣,歡迎添加我的微信:zwwhnly,等你來聊技術、職場、工作等話題(PS:我是一名奮斗在上海的程序員)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM