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

  • 相关阅读:
    php 加入即时推送功能
    Yii GridView::widget
    linux 文件文件夹操作
    一套一般般的前端框架 layui
    supervisor 与 yii定时任务 crontab的使用
    yii 国际化
    如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
    docker搭建lnmp环境
    docker搭建lnmp环境(问题,资料,命令)
    yii2 刷新缓存(刷新模型缓存)
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/6260522.html
Copyright © 2020-2023  润新知