7 -- Spring的基本用法 -- 6... Spring 3.0 提供的Java配置管理

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

 

posted @ 2017-01-07 22:23  limeOracle  阅读(360)  评论(0编辑  收藏  举报