并不是所有的开发人员都喜欢使用XML,所以Spring3.0 为这些人准备了一些特别的东西。可以几乎不使用XML而使用纯粹的Java代码来配置Spring应用。并且基于Java的配置拥有一些XML配置所不具有的技巧。


1. 创建基于Java的配置



仍然需要极少量的XML来启用Java配置。


<?xml version="1.0" encoding="UTF-8"?>
    
    <beans xmlns="http://www.springframework.org/schema/beans"
    
    	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">
    
    	
    
    	<context:component-scan base-package="com.sjf.bean">
    
    	</context:component-scan>
    
     
    
    </beans>


base-package属性告知Spring在com.sjf.bean包内查找使用@Configuration注解所标注的所有类。



2. 定义一个配置类



在基于Java配置里使用@Configuration注解的Java类,来代替XML配置中的<beans>元素。


package com.sjf.bean;
    
     
    
    import org.springframework.context.annotation.Configuration;
    
     
    
    /**
    
     * 基于Java的配置
    
     * @author sjf0115
    
     *
    
     */
    
    @Configuration
    
    public class SpringConfig {
    
    	// Bean declaration methods
    
    	
    
    }



这个类将包含一个或者多个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>元素:


<bean id = "studentBean" class = "com.sjf.bean.Student">
    
    </bean>


@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实战》