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配置文件。