目录
1、前言
2、两种依赖注入的方式
2.1 依赖注入之setter注入
2.2 依赖注入之构造器注入
3、依赖注入之特殊值处理
3.1 字面量赋值
3.2 null值赋值
3.3 XML实体(<)
4、完整测试类
1、前言
依赖注入就是为类的属性赋值,在我们获取bean的时候,bean的各个属性有初始值。以依赖注入的方式为类的属性赋值有两种方式,分别为:setter注入、构造器注入,在本篇中以Minister实体类为例。Minister实体类如下:
public class Minister {
private Integer id;
private String ministerName;
private Integer age;
private char gender;
private Integer ministerDutie;
public Minister(Integer id, String ministerName, Integer age, char gender, Integer ministerDutie) {
this.id = id;
this.ministerName = ministerName;
this.age = age;
this.gender = gender;
this.ministerDutie = ministerDutie;
}
public Minister() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getMinisterName() {
return ministerName;
}
public void setMinisterName(String ministerName) {
this.ministerName = ministerName;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public Integer getMinisterDutie() {
return ministerDutie;
}
public void setMinisterDutie(Integer ministerDutie) {
this.ministerDutie = ministerDutie;
}
@Override
public String toString() {
return "Minister{" +
"id=" + id +
", ministerName='" + ministerName + '\'' +
", age=" + age +
", gender=" + gender +
", ministerDutie=" + ministerDutie +
'}';
}
}
2、两种依赖注入的方式
2.1 依赖注入之setter注入
在Spring配置文件中配置bean时,在property子标签中配置类中各个属性的值。
<bean id="Minister1" class="com.review.spring.pojo.Minister">
<property name="id" value="1" ></property>
<property name="ministerName" value="蒙恬" ></property>
<property name="age" value="20" ></property>
<property name="gender" value="男" ></property>
<property name="ministerDutie" value="2" ></property>
</bean>
property标签:通过组件类的setXxx()方法给组件对象设置属性
name属性:指定属性名(这个属性名是getXxx()、setXxx()方法定义的,和成员变量无关)
value属性:指定属性值
在测试类中根据id和类型的方式获取bean,并输出bean。
@Test
public void getBeanToMinister1() {
//获取IOC容器
ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取IOC容器中的bean
Minister minister=ioc.getBean("Minister1",Minister.class);
System.out.println(minister);
}
输出结果:
2.2 依赖注入之构造器注入
若使用构造器注入,实体类中必须有有参构造方法。下面是以构造器注入的方式配置bean,在bean标签的constructor-arg子标签中配置实体类中各个属性的值。
<bean id="Minister2" class="com.review.spring.pojo.Minister">
<constructor-arg name="id" value="2" ></constructor-arg>
<constructor-arg name="ministerName" value="蒙毅" ></constructor-arg>
<constructor-arg value="18"></constructor-arg>
<constructor-arg value="男"></constructor-arg>
<constructor-arg value="2"></constructor-arg>
</bean>
此时name属性可以忽略不写,但必须按照实体类构造方法中的属性顺序赋值。
在测试类中根据id和类型的方式获取bean,并输出bean。
@Test
public void getBeanToMinister2() {
//获取IOC容器
ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取IOC容器中的bean
Minister minister=ioc.getBean("Minister2",Minister.class);
System.out.println(minister);
}
结果输出
3、依赖注入之特殊值处理
3.1 字面量赋值
当我们声明一个变量age的时候,给age赋值为18,则age就不代表单词age了,而是作为一个变量的名字。当我们引用age 的时候,我们实际上拿到的值是18。如果age带双引号如“age”,那么它就表示一个age单词。“age”就代表它本身,这就是字面量。
在bean标签中的property子标签,使用value属性给bean的属性赋值时,Spring会把value属性的值看做字面量。
如:
<property name="ministerName" value="蒙恬" ></property>
3.2 null值赋值
在bean中给类的属性为null赋值时,不能直接给property标签中的value属性赋null,如下:
<property name="ministerName" value="null" ></property>
以上结果Ministerd的属性ministerName值不为空(null),相反的ministrName的值为字符串“null”。
正确的赋值方式如下,ministerName的值为空(null)。
<property name="ministerName" ><null/></property>
3.3 XML实体(<)
在XML中为类的属性赋值时,值之中含有'<'时,不能在XML文档中随便使用。如要使用'<'有以下两种方式:使用XML实体来代替、使用CDATA节。
①使用XML实体来代替
<表示'<',注意:<后的分号';'不能忘记,否则报错。
<property name="ministerName" value="20<21" ></property>
②使用CDATA节
CDATA中的C代表Character,是文本、字符的含义,CDATA就表示纯文本数据。XML解析器看到CDATA节就知道这里是纯文本,就不会当作XML标签或属性来解析,所以CDATA节中写什么符号都随意。
此时value属性要使用value标签,在标签内为value为name属性表示的变量赋值。
<property name="ministerName" ><value><![CDATA[20<21]]></value></property>
4、完整测试类
public class MinisterTest {
@Test
public void getBeanToMinister1() {
//获取IOC容器
ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取IOC容器中的bean
Minister minister=ioc.getBean("Minister1",Minister.class);
System.out.println(minister);
}
@Test
public void getBeanToMinister2() {
//获取IOC容器
ApplicationContext ioc=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取IOC容器中的bean
Minister minister=ioc.getBean("Minister2",Minister.class);
System.out.println(minister);
}
}