spring javaConfig 配置Bean (通過java程式碼裝配Bea)
儘管在很多場景下通過元件掃描和自動裝配實現spring的自動化裝配時更為推薦的方式。但是有時候自動化配置的方案行不通,因此需要明確配置spring。比如說,你想要將第三方庫中的元件裝配到你的應用中,在這種情況下,是沒有辦法在它的類上新增@Component和@AutoWired註解的,因此就不能使用自動化裝配的方案了。
spring配置Bean有兩種方式:
- 第一種-顯式配置:Java程式碼配置Bean和XML檔案配置Bean。
- 第二種-自動裝配:通過註解自動裝配。
通過java程式碼配置Bean的優點:
- 更加強大:自動裝配實現的功能,它都能實現,還能實現自動裝配不能實現的功能。
- 容易理解:通過java程式碼原生態的方式來配置Bean,程式碼讀起來也比較容易理解。
- 型別安全並且對重構友好。
注意事項: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();
}
}
結果: