目录
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);
    }
} 
                
















