Spring裝配Bean(基於Java程式碼裝配)
通過Java配置裝配Bean
在很多的情況下,Spring基於組建掃描和自動裝配是最佳方式。但是有時候,我們必須使用顯示的裝配。例如,我們使用一個第三方庫,我們不可能為庫中的類添加註釋。接下來我依然用學生讀書的例子來進行演示。
通過Java配置裝配Bean,就是將配置資訊寫在一個Java類中,我們在這裡寫一個配置類。
@Configuration
public class JavaConfig {
}
從上面可以看到,這個類的上面使用@Configuration註釋,這個註釋表明了這個Java類是一個Spring配置類。接下來讓我們看一下怎麼在這裡宣告一個Bean。
@Configuration
public class JavaConfig {
@Bean
public Book mathBook(){
return new MathBook();
}
}
從上面可以看出我們寫了一個可以返回相應物件的方法,並在方法體上面寫上了@Bean註釋,這表明他是一個Bean,當Spring容器要生成Bean的時候,便會呼叫這個方法,的到相應的實體類。這裡生成的Bean的ID就是方法名mathBook。我們也可以為它另起一個名字。我們可以使用@Bean註釋的name屬性做到。
@Configuration public class JavaConfig { @Bean( name= "newName") public Book mathBook(){ return new MathBook(); } }
接來下讓我們看看怎麼利用Java配置實現注入。注入主要有構造器注入和setter方法注入。我們先來看構造器注入的實現。有以下的學生類。
public class Student implements People {
private Book book;
public Student(Book book) {
this.book = book;
}
@Override
public void seeBook() {
book.say();
}
}
我們可以看到,Student類中的book屬性是通過構造方法注入的,我們有兩種寫法。其一如下:
@Configuration
public class JavaConfig {
@Bean
public Book mathBook(){
return new MathBook();
}
@Bean
public People student(Book book){
Student student=new Student(book);
return student;
}
}
或者這樣寫
@Configuration
public class JavaConfig {
@Bean
public Book mathBook(){
return new MathBook();
}
@Bean
public People student(){
Student student=new Student(mathBook());
return student;
}
}
第一種寫法,當Spring容器要生成student的Bean的時候,會將上面生成的mathBook例項傳進去,達到最終的效果。第二種寫法,我們在直接使用mathBook()方法,但其實這種寫法得到的例項還是上面的Bean,Spring並沒有生成一個新的Bean,這是因為Spring攔截了對mathBook()方法的呼叫,然後直接傳入了前面生成的Bean。預設情況下,Spring中的Bean都是單例的。
接下來讓我們看一下怎麼利用settter方法進行注入,其實大家看到這裡也能夠猜到應該怎麼寫,接下來我為大家演示。首先在Student類中寫寫一個關於屬性的setter方法。
public class Student implements People {
private Book book;
public void setBook(Book book) {
this.book = book;
}
@Override
public void seeBook() {
book.say();
}
}
然後在Java配置類中這樣寫。
@Configuration
public class JavaConfig {
@Bean
public Book mathBook(){
return new MathBook();
}
@Bean
public People student(Book book){
Student student=new Student();
student.setBook(book);
return student;
}
}
是不是和你想的一樣?和我們平時使用Java的習慣一樣。
接下來,讓我們看下怎麼進行驗證,在上一個用XML配置的部落格中,我們利用的是junit框架進行驗證,在這裡,我們用一個比較簡單的方法。就是利用Sprng中的AnnotationConfigApplicationContext類,它是Spring的一種應用上下文,利用它,我們可以獲取Spring容器中的Bean,具體用法如下:
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();
context.register(JavaConfig.class);
context.refresh();
MathBook mathBook=(MathBook) context.getBean("mathBook");
Student student=(Student) context.getBean("student");
mathBook.say();
student.seeBook();
context.close();
}
}
我們先得到它的物件,然後用他的register方法指定Java配置類,然後呼叫它的refresh()方法。最後用它的getBean方法得到相應的Bean,傳入的引數是Bean的ID。最後的執行結果如下。