版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/50650413
并不是所有的开发人员都喜欢使用XML,所以Spring3.0 为这些人准备了一些特别的东西。可以几乎不使用XML而使用纯粹的Java代码来配置Spring应用。并且基于Java的配置拥有一些XML配置所不具有的技巧。
1. 创建基于Java的配置
即使Spring的Java配置可以让我们不使用XML就可以编写大多数的Spring配置,但是我们
仍然需要极少量的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>
我们已经知道<context:component-scan>是如何自动注册那些使用某种构造型(stereotype)注解所标注的Bean的。但是它也会自动加载使用@Configuration注解所标注的类。在该例子中,
base-package属性告知Spring在com.sjf.bean包内查找使用@Configuration注解所标注的所有类。
2. 定义一个配置类
在基于Spring的XML配置时,XML配置的根元素是来自Spring Bean命名空间的<beans>元素。而
在基于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
}
@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>元素:
<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实战》