Spring之IOC(DI)基于XML装配bean

Spring概述
Spring是以一个IoC(控制反转)和AOP和AOP为内核的框架。IoC是Spring的基础。IoC实现的是一种控制,简单的说,就是以前调用new构造方法来创建对象,现在变成了使用Spring来创建对象。DI(依赖注入)与IoC的含义相同,从两个角度描述同一概念。简单的说,DI就是对象的属性,已经被注入好相关值,直接使用即可。
什么是控制反转(IoC)
IoC译为控制反转
在这里插入图片描述
Ioc理论是借助第三方实现具有依赖关系之间的解耦,如上图所示。
应用程序在没有IoC容器之前,如果对象A依赖对象B(A类中要实例B对象),那么在A类实例化在某一 点时,自己必须主动创建对象B或着使用已经创建好的对象B,其中无论是创建还是使用已经创建好的对象B,控制权都在程序本身。如果程序引入了IoC容器之后,对象A和对象B之间失去了直接联系,在A对象创建过程中需要实例B的时候,IoC容器会主动创建对象B注入(依赖注入)到对象A需要的地方,此时对象A依赖对象B的过程由主动行为变成了被动行为,即把创建对象交给了IoC容器处理,控制权颠倒过来了,这就是所谓的控制反转

那什么是依赖注入呢(DI)
所谓的依赖注入,就是由IoC容器在程序运行期间动态地将某种依赖关系注入到对象之中,其实DI和IoC是对同一事件的不同描述,DI的角度是程序,也就是程序靠依赖着IoC容器创建并注入所需要的外部资源。而IoC的角度是容器。

Spring核心容器
Spring框架提供两种核心容器BeanFactoryApplicationContext,IoC/DI通常有setter注入和构造方式注入两种方式实现

下面介绍一下常用的高级接口ApplicationContext
主要的实现类有三个
FileSystemXmlApplicationContext:从文件系统中的XML文件加载上下文定义的信息。
ClassPathXmlApplicationContext:从类路径(src)的XML文件加载上下定义的信息,把上下文定义的文件当成类路径资源。
XmlWebApplicationContext:从Web系统中的XML文件加载上下文中定义的信息。

下面介绍Spring中基于XML装配Bean

一、通过set方法注入
JavaBean的User类

/**
 * 测试Spring基于xml进行set DI(set属性注入)
 */
public class User {
   private String name;
   private String id;

    public void setName(String name) {
        this.name = name;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void print(){
        System.out.println(name+"::"+id);
    }
}

XML文件配置Bean标签

<!--    set方法注入属性-->
    <bean id="user" class="cn.kexing.spring5.User">
        <property name="id" value="2018412205"></property>
        <property name="name" value="可星"></property>
    </bean>

测试代码

    @Test
    public void testUser(){
        //加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        //获取配置创建对象
        User user = context.getBean("user", User.class);
        System.out.println(user);
        user.print();
    }

ClassPathXmlApplicationContext类中的参数是配置的xml文件

程序结果

cn.kexing.spring5.User@1a677343
可星::2018412205

二、通过构造方法注入
JavaBean的Order类

/**
 * 测试有参构造注入属性
 */
public class Order {
    String name;
    String address;

    public Order(String name, String address) {
        this.name = name;
        this.address = address;
    }
    public void print(){
        System.out.println(name+"::"+address);
    }
}

javabean类中必须要有有参的构造函数

XML标签配置:

<!--    构造方法注入属性-->
    <bean id="order" class="cn.kexing.spring5.Order">
        <constructor-arg name="name" value="张三"></constructor-arg>
        <constructor-arg name="address" value="m78"></constructor-arg>
    </bean>

测试代码

    @Test
    public void testOder(){
        //加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        //获取配置对象
        Order order = context.getBean("order",Order.class);
        System.out.println(order);
        order.print();
    }

程序结果

cn.kexing.spring5.Order@1a677343
张三::m78

三、P名称标签的注入(基于set注入)
XML文件beans中加上配置:

xmlns:p="http://www.springframework.org/schema/p"

因为是基于set注入,所有javabean类必须有无参构造和set方法,下面以上文的User类举例
XML标签配置:

<!--    xml p名称空间简化set属性的注入 底层还是set方法注入-->
    <bean id="order2" class="cn.kexing.spring5.User" p:id="20181111" p:name="王老吉"></bean>

测试代码

    @Test
    public void testUser(){
        //加载spring配置文件
        ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
        //获取配置创建对象
        User user = context.getBean("user2", User.class);
        System.out.println(user);
        user.print();
    }

程序结果:

cn.kexing.spring5.User@1a677343
王老吉::20181111

四、若注入的属性为空值时

    <bean id="book" class="cn.kexing.spring5.Book">
        <property name="name" value="操作系统"></property>
<!--        给price属性设置空null值-->
        <property name="price">
            <null/>
        </property>
    </bean>

在property 标签内加<null/>标签

五、当属性值为特殊符号时

 <bean id="book2" class="cn.kexing.spring5.Book">
<!--        属性值为特殊符号-->
        <property name="name">
            <value><![CDATA[<<操作系统>>]]></value>
        </property>

        <property name="price" value="123.7"></property>
    </bean>

在property 标签内加<value>标签<![CDATA[属性值]]>

最后修改:2021 年 11 月 15 日 05 : 26 PM
如果觉得我的文章对你有用,请随意赞赏