xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
我們已經知道是如何自動注冊那些使用某種構造型(stereotype)注解所標注的Bean的。但是它也會自動加載使用@Configuration注解所標注的類。在該例子中,base-package屬性告知Spring在com.sjf.bean包內查找使用@Configuration注解所標注的所有類。
2. 定義一個配置類
在基於Spring的XML配置時,XML配置的根元素是來自Spring Bean命名空間的元素。而在基於Java配置裡使用@Configuration注解的Java類,來代替XML配置中的元素。
package com.sjf.bean;
import org.springframework.context.annotation.Configuration;
/**
* 基於Java的配置
* @author sjf0115
*
*/
@Configuration
public class SpringConfig {
// Bean declaration methods
}
@Configuration注解作為一個標示告知Spring:這個類將包含一個或者多個Spring Bean的定義。這些Bean的定義是使用@Bean注解所標注的方法。
3. 聲明一個簡單類
我們使用@Bean注解標注一個方法來定義studentBean Bean:
package com.sjf.bean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* 基於Java的配置
* @author sjf0115
*
*/
@Configuration
public class SpringConfig {
// Bean declaration methods
@Bean
public Student studentBean(){
return new Student();
}
}
這個簡單方法就是Java配置,它等價與我們之前使用XML所配置的元素:
@Bean告知Spring這個方法將返回一個對象,該對象應該被注冊為Spring應用上下文中的一個Bean。方法名作為該Bean的ID。在該方法中所實現的所有邏輯本質上都是為了創建Bean。上面例子中,該方法創建並返回一個Student的實例對象,該對象被注冊為Spring應用上下文中ID為studentBean的Bean。
優點:
在XML配置中,Bean的類型和ID都是由Spring屬性來表示的。Spring標識符的缺點是它們無法進行編譯器檢查。在Spring的基於Java的配置中並沒有String屬性。Bean的ID和類型都被視為方法簽名的一部分。Bean的實際創建是在方法體中定義的。因為它們全都是Java代碼,所以我們可以進行編譯器檢查確保Bean的類型是合法類型,並且Bean的ID是唯一的。
4. 使用Spring的基於Java的配合進行注入
對於以前使用構造器注入的方式,在使用Java的配置,只需把數字直接傳入構造器中即可:
@Bean
public Student studentBean(){
return new Student("yoona",24);
}
使用Java的配置,定義Bean就像我們使用Java編寫類的實例化代碼一樣。
我們再看看setter注入,在Java的配置中,如何實現?
@Bean
public Student studentBean(){
Student stu = new Student();
stu.setName("yoona");
stu.setAge(24);
return stu;
}
那麼Bean裝配另一個Bean的引用?
我們先創建一個待引用的Bean:
@Bean
public School schoolBean(){
School school = new School();
school.setName("西安電子科技大學");
school.setLocation("西安");
return school;
}
現在來看看怎麼引用一個Bean,我們通過構造器為它裝配上面那個Bean:
@Bean
public Student yoonaStudent(){
return new Student(schoolBean());
}
注意:
在Spring的Java配置中,通過聲明方法引用一個Bean並不等於等於調用該方法。如果真這樣,每次調用schoolBean(),都將得到該Bean的一個新的實例。通過使用@Bean注解標注schoolBean()方法,會告知Spring我們希望該方法定義的Bean要被注冊進Spring的應用上下文中。因此,其他Bean的聲明方法中運用這個方法時,Spring都會攔截該方法的調用,並嘗試在應用上下文中查找該Bean,而不是讓方法創建一個新的實例。
5. 運行
一旦配置類定義,可以加載和提供他們使用AnnotationConfigApplicationContext 如下:
package com.sjf.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Test {
private static ApplicationContext context;
public static void main(String[] args){
context = new AnnotationConfigApplicationContext(SpringConfig.class);
Student student = (Student)context.getBean("yoonaStudent");
student.setName("yoona");
student.setAge(24);
System.out.println(student.toString());
}
}
參考:《Spring實戰》