1. 程式人生 > >spring javaConfig 配置Bean (通過java程式碼裝配Bea)

spring javaConfig 配置Bean (通過java程式碼裝配Bea)

       儘管在很多場景下通過元件掃描和自動裝配實現spring的自動化裝配時更為推薦的方式。但是有時候自動化配置的方案行不通,因此需要明確配置spring。比如說,你想要將第三方庫中的元件裝配到你的應用中,在這種情況下,是沒有辦法在它的類上新增@Component和@AutoWired註解的,因此就不能使用自動化裝配的方案了。

 spring配置Bean有兩種方式:

  1. 第一種-顯式配置:Java程式碼配置Bean和XML檔案配置Bean。
  2. 第二種-自動裝配:通過註解自動裝配。

通過java程式碼配置Bean的優點:

  1. 更加強大:自動裝配實現的功能,它都能實現,還能實現自動裝配不能實現的功能。
  2. 容易理解:通過java程式碼原生態的方式來配置Bean,程式碼讀起來也比較容易理解。
  3. 型別安全並且對重構友好。

注意事項:JavaConfig不應該侵入到業務邏輯程式碼之中。通常將JavaConfig放到單獨的包中,使它與其他的應用程式邏輯分離,這樣就不會對它的意圖產生疑惑

1.建立配置類

建立javaConfig類的關鍵在於為其新增@Configuration註解,這個註解表明它是一個配置類,該類包含在spring應用上下文中如何建立bean的細節。

有一臺電腦,它的配件有滑鼠和鍵盤。此類是配置類在其類上加註解@Configuration。

ComputerConfig類如下:

@Configuration
public class ComputerConfig {
    
}

鍵盤類如下:

package javaConfigDemo;

public class Keyboard {
    String channel;
    String key;

    public Keyboard(String channel, String key) {
        this.channel = channel;
        this.key = key;
    }

    public Keyboard() {
    }

    public String getChannel() {
        return channel;
    }

    public void setChannel(String channel) {
        this.channel = channel;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}

滑鼠類如下:

package javaConfigDemo;

public class Mouse {
    String channel;
    String mouseKey;

    public Mouse(String channel, String mouseKey) {
        this.channel = channel;
        this.mouseKey = mouseKey;
    }

    public Mouse() {
    }

    public String getChannel() {
        return channel;
    }

    public void setChannel(String channel) {
        this.channel = channel;
    }

    public String getMouseKey() {
        return mouseKey;
    }

    public void setMouseKey(String mouseKey) {
        this.mouseKey = mouseKey;
    }
}


可以看到這兩個元件類並沒有應用任何的註解(例如自動裝配裡面的元件註解@Component)

Computer類如下:

package javaConfigDemo;

public class Computer {
    private Mouse mouse;
    private Keyboard keyboard;

    public Computer(Mouse mouse, Keyboard keyboard) {
        this.mouse = mouse;
        this.keyboard = keyboard;
    }

    public void  say(){
        System.out.println(mouse.getChannel()+":"+mouse.getMouseKey()+": hashcode :"+mouse.hashCode());
        System.out.println(keyboard.getChannel()+":"+keyboard.getKey()+": hashcode :"+keyboard.hashCode());
    }

}

在ComputerConfig配置類裡面宣告簡單的Bean

@Bean註解括號裡面的字串就是bean的名字,也可以不加,預設bean的名字是@Bean註解所對應的方法的方法名。

這個方法返回需要建立的例項,例如computer Bean和 mouse Bean,都是利用所需型別的構造方法來返回一個與所需型別的例項,

return new Mouse("無線","3key");
return new Keyboard("1.5m","108key");
至於某些Bean需要其他型別的物件例如Computer物件的構造方法需要Mouse物件和KeyBoard物件,
public Computer(Mouse mouse, Keyboard keyboard) {
    this.mouse = mouse;
    this.keyboard = keyboard;
}

針對這些可以使用下面的的方法:在建立Computer Bean的時候給它引數,使用這種方法可以將Mouse和KeyBoard型別的Bean注入到Computer Bean中。

@Bean(name = "computer")
public Computer computer(Mouse mouse,Keyboard keyboard){
    return new Computer(mouse,keyboard);

}

還有一種不推薦的方式就是:明確的使用其他型別的@Bean方法

@Bean(name = "computer")
public Computer computer(){
    return new Computer(mouse(),keyboard());

}
綜上,建立的ComputerConfig類如下:
@Configuration
public class ComputerConfig {
    @Bean(name = "mouse")
    public Mouse mouse(){
        return new Mouse("無線","3key");
    }
    @Bean(name = "computer")
    public Computer computer(Mouse mouse,Keyboard keyboard){
        return new Computer(mouse,keyboard);

    }
    @Bean(name = "keyboard")
    @Scope("prototype")
    public Keyboard keyboard(){
        return new Keyboard("1.5m","108key");
    }
}

測試:

獲取上下文:

ApplicationContext applicationContext=new AnnotationConfigApplicationContext(javaConfigDemo.ComputerConfig.class);
public class Main {
    public static void main(String[] args) {
        //注意這裡不可以加雙引號
        ApplicationContext applicationContext=new AnnotationConfigApplicationContext(javaConfigDemo.ComputerConfig.class);
        Computer computer=(Computer)applicationContext.getBean("computer");
        computer.say();
        computer.say();
        computer.say();

    }
}
結果: