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 * */@Configurationpublic 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 * */@Configurationpublic 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實戰》