7.6 Spring 3.0 提供的Java配置管理
Spring 允许使用Java类进行配置管理,可以不使用XML来管理Bean,以及Bean之间的依赖关系。
Interface :Person
package edu.pri.lime._7_6.bean; public interface Person { void userAxe(); }
Interface : Axe
package edu.pri.lime._7_6.bean; public interface Axe { String chop();
}
Class : Chinese
package edu.pri.lime._7_6.bean.impl; import edu.pri.lime._7_6.bean.Axe;
import edu.pri.lime._7_6.bean.Person; public class Chinese implements Person { private Axe axe;
private String name;
public Axe getAxe() {
return axe;
}
public void setAxe(Axe axe) {
this.axe = axe;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void userAxe() {
System.out.println("我是:" + name + "," + axe.chop());
}
}
Class : StoneAxe
package edu.pri.lime._7_6.bean.impl; import edu.pri.lime._7_6.bean.Axe; public class StoneAxe implements Axe { public String chop() {
return "石斧砍柴真慢";
} }
Class : SteelAxe
package edu.pri.lime._7_6.bean.impl; import edu.pri.lime._7_6.bean.Axe; public class SteelAxe implements Axe { public String chop() {
return "钢斧砍柴真快";
} }
Class : AppConfig
package edu.pri.lime._7_6.bean.configuration; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import edu.pri.lime._7_6.bean.Axe;
import edu.pri.lime._7_6.bean.Person;
import edu.pri.lime._7_6.bean.impl.Chinese;
import edu.pri.lime._7_6.bean.impl.SteelAxe;
import edu.pri.lime._7_6.bean.impl.StoneAxe; //指定类为配置类
@Configuration
public class AppConfig { // 相当于定义一个名为personName的变量,其值为“lime”
@Value("lime")
String personName;
// 配置Bean : stoneAxe
@Bean(name="stoneAxe")
public Axe stoneAxe(){
return new StoneAxe();
}
// 配置Bean : steelAxe
@Bean(name="steelAxe")
public Axe steelAxe(){
return new SteelAxe();
}
// 配置一个Bean:chinese
@Bean(name="chinese")
public Person chinese(){
Chinese person = new Chinese();
person.setName(personName);
person.setAxe(steelAxe());
return person;
}
}
Class :BeanTest
package edu.pri.lime._7_6.main; import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; import edu.pri.lime._7_6.bean.Person;
import edu.pri.lime._7_6.bean.configuration.AppConfig;
import edu.pri.lime._7_6.bean.impl.Chinese; public class BeanTest { public static void main(String[] args){
//使用Java配置类管理Spring容器中的Bean及其依赖关系时,使用AnnotationConfigApplication创建容器
ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
Person chinese = ctx.getBean("chinese",Chinese.class);
chinese.userAxe();
}
}
@Configuration : 用于修饰一个Java配置类
@Bean : 用于修饰一个方法,将该方法的返回值定义成容器中的一个Bean。
@Value : 用于修饰以恶搞Field,用于为该Field配置一个值,相当于配置一个变量。
@Import : 修饰一个Java配置类,用于向当前Java配置类中导入其他Java配置类。
@Scope : 用于修饰一个方法,指定该方法对应的Bean的生命域。
@Lazy : 用于修饰一个方法,指定该方法对应的Bean是否需要延迟初始化。
@DependsOn : 用于修饰一个方法,指定在初始化该方法对应的Bean之前初始化指定的Bean。
在实际项目中可能会混合使用XML配置和Java类配置混合使用:
⊙ 如果以XML配置为主,就需要让XMLpehiz能加载Java类配置。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring 配置文件的根元素,使用Spring-beans-4.0.xsd语义约束 -->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- 加载Java配置类 -->
<bean class="edu.pri.lime._7_6.bean.configuration.AppConfig" />
</beans>
由于以XML配置为主,因此应用创建Spring容器时,还是以XML配置文件为参数来创建ApplicationContext对象。那么Spring会先加载XML配置文件,在根据XML配置文件的指示去加载指定的Java配置类。
⊙ 如果以Java类配置为主,就需要让Java配置类能加载XML配置。在配置类上增加@ImportResource注解,修饰Java配置类,用于导入指定的XML配置文件。
package edu.pri.lime._7_6.bean.configuration; import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource; import edu.pri.lime._7_6.bean.Axe;
import edu.pri.lime._7_6.bean.Person;
import edu.pri.lime._7_6.bean.impl.Chinese;
import edu.pri.lime._7_6.bean.impl.SteelAxe;
import edu.pri.lime._7_6.bean.impl.StoneAxe; //指定类为配置类
@Configuration
@ImportResource(value = { "classpath:app_7_6.xml" })
public class AppConfig { // 相当于定义一个名为personName的变量,其值为“lime”
@Value("lime")
String personName;
// 配置Bean : stoneAxe
@Bean(name="stoneAxe")
public Axe stoneAxe(){
return new StoneAxe();
}
// 配置Bean : steelAxe
@Bean(name="steelAxe")
public Axe steelAxe(){
return new SteelAxe();
}
// 配置一个Bean:chinese
@Bean(name="chinese")
public Person chinese(){
Chinese person = new Chinese();
person.setName(personName);
person.setAxe(steelAxe());
return person;
}
}
由于以Java类配置为主,因此应用创建Spring容器时,应以Java配置类为参数,通过创建AnnotationConfigApplicationContext对象作为Spring容器。那么Spring会先加载Java配置类,在根据Java配置类的指示去加载指定的XML配置文件。