美文网首页Java 杂谈JAVA学习记录
《Spring实战》-第二章:Bean的装配(1)-XML显式装

《Spring实战》-第二章:Bean的装配(1)-XML显式装

作者: 廖小明的赖胖子 | 来源:发表于2019-02-28 22:50 被阅读0次

    慢慢来比较快,虚心学技术

    前言:创建应用对象之间协作关系的行为通常称为装配( wiring ),这也是依赖注入( DI )的本质

    Spring提供三种Bean装配机制:

    1. 在 XML 中进行显式配置。
    2. 在 Java 中进行显式配置
    3. 隐式的 bean 发现机制和自动装配

    *原文连接:https://blog.csdn.net/Laiguanfu/article/details/88046259

    本文简单讲解Spring中使用xml方式进行显式配置装配Bean的步骤和内容分析

    使用xml进行Bean的装配是Spring最原始也是持续时间最长的装配方式,该配置文件使用<beans>作为根节点,配置处于应用内的Bean。

    一、简单使用

    本文使用最简单的配置,只为记录xml显式装配bean的实现,maven引用如下(其中${org.springframework.version}可替换成任意版本):

    <!--spring框架引入-->
    <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-core</artifactId>
         <version>${org.springframework.version}</version>
    </dependency>
    
    <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${org.springframework.version}</version>
    </dependency>
    
    <dependency>
           <groupId>org.springframework</groupId>
           <artifactId>spring-test</artifactId>
           <version>${org.springframework.version}</version>
    </dependency>
    

    ①编写基础类CDBean代码

    public class CDBean {
    
        /**
         * 定义CD名
         */
        private String title;
    
        /**
         * 定义CD作者
         */
        private String author;
    
    }
    

    ②编写接口类CDPlayer

    public interface CDPlayer {
    
        /**
         * 定义方法播放CD
         *  @param
         *       
         * @return void
         *       
         * @author lai.guanfu 2019/2/27
         * @version 1.0
         **/
        void playCD();
    
    }
    

    ③编写接口实现类,同时将CDBean作为属性通过setter方法传入

    public class CDPlayerImpl implements CDPlayer {
    
        private CDBean cdBean;
    
        public void setCDBean(CDBean cdBean){
            this.cdBean = cdBean;
        }
    
        @Override
        public void playCD() {
            System.out.println("正在播放:"+cdBean.getTitle()+" by "+cdBean.getAuthor());
        }
    }
    

    ④创建XML配置文件application.xml(命名随意)

    注:IDEA中可以选择使用默认的File菜单快速创建Spring默认简单格式的配置文件

    idea添加spring配置文件

    得到简单格式的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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    </beans>
    

    ⑤使用<bean>节点配置CDBean并使用<peroperty>节点进行属性默认值注入

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--定义一个名为cdBean的Bean-->
        <bean name="cdBean" class="com.my.spring.bean.CDBean">
            <!--默认值注入-->
            <property name="title" value="The World!!"/>
            <property name="author" value="Mr.D"/>
        </bean>
    
    </beans>
    

    ⑥ 用<bean>节点配置CDPlayer并使用<peroperty>节点进行属性默认值注入

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean name="cdBean" class="com.my.spring.bean.CDBean">
            <property name="title" value="The World!!"/>
            <property name="author" value="Mr.D"/>
        </bean>
    
        <bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
            <!--将上面配置的cdBean类通过ref属性注入到cdPlayer中名为cdBean的属性中-->
            <property name="cdBean" ref="cdBean"/>
        </bean>
    </beans>
    

    ⑦通过上一篇文章提及的获取配置文件应用上下文ClassPathXmlApplicationContext中获取目标bean并进行测试

    public class App 
    {
        public static void main(String[] args) {
            /**
             * 从根目录的application.xml文件中构建应用上下文
             */
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application.xml");
    
            /**
            *从应用上下文中获取所有bean的类名
            */
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
            for (String className : beanDefinitionNames){
                System.out.println(className);
            }
    
            /**
             * 从应用上下文中提取目标实体
             */
            CDPlayer cdPlayer = applicationContext.getBean(CDPlayer.class);
    
            /**
             * 执行方法进行测试
             */
            cdPlayer.playCD();
        }
    }
    

    ⑧测试结果,cdBean和cdPlayer成功装配,且cdBean默认属性注入和cdPlayer的cdBean属性依赖注入成功

    cdBean
    cdPlayer
    正在播放:The World!! by Mr.D
    

    二、xml文件分析

    节点<bean>:装配Bean的根本性节点

    |======属性 class -------注明当前装配的Bean的class类型

    |======属性 id -------为当前装配的Bean添加一个唯一性标识

    |======属性 name-------为当前装配的Bean添加一个别名,可等同id

    |======属性 parent -------指定当前装配的Bean的父类在xml文件中对应的name/id

    <bean id = "bean1" name = "alis1" class = "com.xxx.类名" parean = "beanParent"></bean>
    

    |======子节点 <property>: 为bean注入属性操作而服务

    |===========属性 name ------对应于Bean实体中的属性名称

    |===========属性 value ------name指定属性的默认字面量值

    |===========属性 **ref **-------name指定属性同样是一个被装配的类,ref的值是目标Bean的id

    <bean id = "bean2" name = "alis2" class = "com.xxx.类名">
            <property name = "p" value = "testProperty">
            <property name = "q" ref = "bean1">
    </bean>
    

    |======子节点 <constructor-arg>: 从bean的构造函数中注入参数(以下)
    |===========属性 name ------对应于构造函数中的参数名称
    |===========属性 value ------name指定参数的默认字面量值
    |===========属性 ref -------name指定参数同样是一个被装配的类,ref的值是目标Bean的id
    |===========属性 index ------指定当前参数在构造函数中的下标
    |===========属性 type ------指定目标参数的类型

    <bean id = "bean3" name = "alis3" class = "com.xxx.类名">
         <constructor-arg name = "param1" value = "value1"/>
         <constructor-arg index = 1 value = "value2"/>
         <constructor-arg index = 2 ref = "bean2"/>
         <constructor-arg type = "com.xxx.类名" ref = "value2"/>
    </bean>
    

    三、属性注入

    简单示例里面的注入方式,实际上使用的是bean里面的setter方法注入,要求对应属性在bean中必须存在setter方法,否则无法注入
    使用构造器注入

    public class CDPlayerImpl implements CDPlayer {
        private CDBean cdBean;
    
        public CDPlayerImpl() {
            super();
        }
    
        public CDPlayerImpl(CDBean cdBean) {
            super();
            this.cdBean = cdBean;
        }
    }
    

    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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--定义一个名为cdBean的Bean-->
        <bean name="cdBean" class="com.my.spring.bean.CDBean">
            <!--默认值注入-->
            <property name="title" value="The World!!"/>
            <property name="author" value="Mr.D"/>
        </bean>
    
        <bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
            <!--将上面配置的cdBean类通过ref属性注入到cdPlayer构造方法中名为cdBean的参数中-->
            <constructor-arg name = "cdBean" ref = "cdBean"/>
        </bean>
    </beans>
    

    注入列表参数

    此处涉及到<list><set>节点,用于注入列表或者数组

    假设CDPlayerImpl类中有属性cdBeans

    public class CDPlayerImpl implements CDPlayer {
        private List<CDBean> cDBeans;
    
        public void setCDBeans(List<CDBean> cDBeans){
            this.cDBeans = cDBeans;
        }
    }
    

    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"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--定义一个名为cdBean1的Bean-->
        <bean name="cdBean1" class="com.my.spring.bean.CDBean">
            <!--默认值注入-->
            <property name="title" value="One"/>
            <property name="author" value="Mr.D"/>
        </bean>
    
         <!--定义一个名为cdBean2的Bean-->
        <bean name="cdBean2" class="com.my.spring.bean.CDBean">
            <!--默认值注入-->
            <property name="title" value="Two"/>
            <property name="author" value="Mr.D"/>
        </bean>
    
        <bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
            <property name="cDBeans">
                <list>
                    <ref bean = "cdBean1"> 
                    <ref bean = "cdBean2"> 
                </list>
            </property>
        </bean>
    </beans>
    

    注:无论类中使用的是list还是使用set或者数组作为属性,xml中都可以使用list或set进行注入

    四、小结

    1.spring依靠xml文件进行显式装配,xml文件的根节点是<beans>,包含多个<bean>节点

    2.xml文件中每个bean节点可以指定对应组件的类型,名称

    3.xml文件中,通过bean的property子节点实现属性初始化或依赖注入

    4.xml文件中,通过bean的constructor-arg子节点实现构造器参数初始化或依赖注入

    5.xml文件中,通过property或constructor-arg的子节点<list>或<set>实现列表的注入

    6.所有通过xml显式配置的bean,在代码中通过上一篇文章所描述的应用上下文实现ClassPathXmlApplicationContext从容器中获取实体

    参考文档:

    【1】《Spring 实战(第 4 版)》·Craig Walls

    相关文章

      网友评论

        本文标题:《Spring实战》-第二章:Bean的装配(1)-XML显式装

        本文链接:https://www.haomeiwen.com/subject/wopluqtx.html