通过Spring的配置文件为bean注入特殊值

205 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情

前面的文章介绍了在spring的配置文件如何进行简单的依赖注入,即setter注入以及构造器注入。如果我们想通过配置文件来注入其他特殊的值,如null对象或者特殊符号等,仅仅依靠前面的知识是不够的,这一篇文章就是来介绍如何注入特殊值。如果对setter注入和构造器注入不太熟悉的话,可以参考此篇文章

1.特殊值处理

这一小节的内容主要是介绍在spring中,如何在配置文件里为bean注入特殊的值,如注入null或者<>等类似的值。

1.1 字面量赋值

什么是字面量?

我们声明一个变量a,如:int a = 1。这时a就不代表字母a了,而是一个变量的名字,我们引用a,其实就是拿到了1。

如果a用单引号包起来,如'a'。这时a就代表字母a,说白了a就是a,没有任何引申的意义,你看到的是什么,那就是什么,这就是字面量。

在spring中,我们用value属性的值为属性名赋值时,spring会将value属性的值看成字面量

<bean id="studentTwo" class="com.atguigu.spring.pojo.Student">
    <!--property:通过成员变量的set方法进行赋值 name:指定属性名  value:为属性名注入的值-->
    <property name="sid" value="1001"></property>
    <property name="sname" value="张三"></property>
    <property name="age" value="23"></property>
    <property name="gender" value="男"></property>
</bean>

1.2 注入null值

注意:value属性的值会被spring当成字面量,所以你不能通过value="null"为属性名赋一个null对象,如果你通过这种方式只会注入一个字符串,这个字符串的值是“null”

<bean id="studentFour" class="com.atguigu.spring.pojo.Student">
    <property name="sid" value="1003"></property>
    <property name="sname" value="王五"></property>
    <!--代表的不是null对象,而是一个叫null的字符串-->
    <property name="gender" value="null"></property>
</bean>

验证

我们获取bean,然后通过这个bean去获取gender属性,如果这个gender属性的值是null对象,那么当它调用toString方法的时候肯定会报错。如果没有报错说明gender属性的值是一个null字符串。

@Test
public void testDI() {
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取bean
    Student student = ioc.getBean("studentFour", Student.class);
    System.out.println(student.getGender().toString());
}

我们可以发现没有报错,那么我们刚刚注入的便不是null对象。 image.png 我们应该如何做才能在spring的配置文件里注入null对象? 我们只需在需要设置null对象的property里设置一个null标签,具体如下:

<bean id="studentFour" class="com.atguigu.spring.pojo.Student">
    <property name="sid" value="1003"></property>
    <property name="sname" value="王五"></property>
    <!--代表的不是null对象,而是一个叫null的字符串-->
    <!--<property name="gender" value="null"></property>-->
    <property name="gender">
        <null />
    </property>
</bean>

验证,再次运行代码,如果报了空指针异常,说明我们成功的注入了null对象

image.png

1.3 xml实体

xml是可扩展标记语言,有些字符我们是没法直接使用的,我们需要使用它们的实体,比如:<和>。如果你想注入<或者>,必须引用它们的实体。

<!--
    <的实体: &lt;
    >的实体: &gt;
-->
<bean id="studentFour" class="com.atguigu.spring.pojo.Student">
    <property name="sid" value="1003"></property>
    <!--如果你想注入<王五>,又不引用大于号和小于号的实体,你的标签会报错-->
    <property name="sname" value="&lt;王五&gt;"></property>
    <!--代表的不是null对象,而是一个叫null的字符串-->
    <!--<property name="gender" value="null"></property>-->
    <property name="gender">
        <null />
    </property>
</bean>

验证是否注入了大于号和小于号

@Test
public void testDI() {
    //获取IOC容器
    ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
    //获取bean
    //Student student = ioc.getBean("studentTwo", Student.class);
    Student student = ioc.getBean("studentFour", Student.class);
    /*System.out.println(student.getGender().toString());*/
    System.out.println(student);
}

image.png

1.4 CDATA节

CDTA是xml里一个特殊的标签,里面的内容会被原样解析。CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据。XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析。

CDTA是xml里一个特殊的标签,所以它不能写在属性里面。如果你要写它,你需要将它写成一个标签。这个标签不好写,你在idea里面有快捷键帮我们创建这个标签,具体做法是在需要这个标签的位置写入大写的CD,然后就有提示了,跟着提示操作即可。

<bean id="studentFour" class="com.atguigu.spring.pojo.Student">
    <property name="sid" value="1003"></property>
    <!--<property name="sname" value="王五"></property>-->
    <!--如果你想注入<王五>,又不引用大于号和小于号的实体,你的标签会报错-->
    <!--<property name="sname" value="&lt;王五&gt;"></property>-->
    <property name="sname">
        <value><![CDATA[<王五>]]></value>
    </property>
    <!--代表的不是null对象,而是一个叫null的字符串-->
    <!--<property name="gender" value="null"></property>-->
    <property name="gender">
        <null />
    </property>
</bean>

验证,运行代码

image.png