目录
3.4.1 创建基于Java的配置
Spring中为了减少XML配置,可以声明一个配置类对bean进行配置,主要用到两个注解@Configuration和@bean。
首先,XML中进行少量的配置来启动java配置,spring-idol.xml
<?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.springinaction.springidol"/>
</bean>
3.4.2 定义一个配置类
用@Configuration注解该类,等价于XML里的<beans>,用@Bean注解方法,等价于XML配置的<bean>,方法名等于Bean ID。代码如下:
package com.springinaction.springidol;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringIdolConfig {
//Bean declaration methods go here
}
@Configuration注解会作为一个标识告诉Spring:这个类将包含一个或多个Spring Bean的定义。这些Bean的定义是使用@Bean注解所标注的方法。
3.4.3 声明一个简单的Bean
用@Bean注解标注一个方法来定义duke Bean:
package com.springinaction.springidol;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringIdolConfig {
@Bean
public Performer duke(){
return new Juggler();
}
}
这就是java配置,等价于之前使用XML所配置的<bean>元素。@Bean告知Spring这个方法将返回一个对象,该对象应该被注册为Spring应用上下文中的一个Bean。方法名作为该Bean的ID。
Spring的Java配置中想对于XML配置有一个优点。在XML配置 中,Bean 的类型和ID都是由String属性来标识的。String标识符的缺点是它们无法进行编译期检查。如果重新命名了Juggler类,或许会忘记修改相对应的XML配置。
在Spring的java配置中,美哟String属性。Bean的ID和类型都被视为方法签名的一部分。Bean的实际创建是在方法体中定义的。因为它们全是java代码,所以可以进行编译期检查来确保Bean的类型都是合法类型,并且Bean的ID是唯一的。
3.4.4 使用Spring的基于Java的配置进行注入
为Bean注入一个值,使用基于Java的配置,只需要把数字直接传入构造器中:
@Bean
public Performer duke15(){
return new Juggler(15);
}
Setter注入也是自然的java代码:
@Bean
public Performer kenny(){
Instrumentalist kenny = new Instrumentalist();
kenny.setSong("Jingle Bells");
return kenny;
}
Bean装配另一个Bean的引用。首先用Java声明一个sonnet29 Bean
@Bean
private Poem sonnet29(){
return new Sonnet29();
}
之后创建一个PoeticJuggler Bean,通过构造器为它装配sonnet29 Bean:
@Bean
public Performer poeticJuggler(){
return new PoeticJuggler(sonnet29());
}
在Spring的java配置中,通过声明方法引用一个Bean并不等同与调用该方法,如果真的这样,每次调用sonnet29(),都将得到该Bean的一个新的实例。Spring要比这聪明多了。
通过使用@Bean注解标注sonnet29()方法,会告知Spring我们希望该方法定义的Bean‘要被注册进Spring的应用上下文中。因此,在其他Bean的声明方法中引用这个方法时,Spring都会拦截该方法的调用,并尝试在应用上下文中查找该Bean,而不是让方法创建一个新的实例。