开启掘金成长之旅!这是我参与「掘金日新计划 · 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对象。
我们应该如何做才能在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对象
1.3 xml实体
xml是可扩展标记语言,有些字符我们是没法直接使用的,我们需要使用它们的实体,比如:<和>。如果你想注入<或者>,必须引用它们的实体。
<!--
<的实体: <
>的实体: >
-->
<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>
验证是否注入了大于号和小于号
@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);
}
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="<王五>"></property>-->
<property name="sname">
<value><![CDATA[<王五>]]></value>
</property>
<!--代表的不是null对象,而是一个叫null的字符串-->
<!--<property name="gender" value="null"></property>-->
<property name="gender">
<null />
</property>
</bean>
验证,运行代码