依赖注入就是一个类需要另一个类的协助来完成工作,这就产生了依赖,所以需要的依赖项就要注入过来协同完成工作,依赖注入是实现控制反转的方式之一。

构造器注入

构造器注入保证了一些必要的属性在Bean实例化时就设置,并且确保了bean实例在实例化后就可以使用。在类中,不用为属性设置setter方法,只需提供构造方法即可,在构造文件中配置该类bean,并配置构造器,在配置构造器中用。

方式一(根据参数名字注入,推荐使用)

  1. <!-- 第二种根据参数名字设置 -->
  2. <bean id="user" class="com.wjh.po.User">
  3. <constructor-arg name="name" value="阿离"/>
  4. </bean>

方式二(根据index参数下标注入)

<bean id="user" class="com.wjh.po.User"> 
  <constructor-arg index="0" value="阿离"/> 
</bean>

方式三(根据参数类型注入,不推荐使用)

<bean id="user" class="com.wjh.po.User"> 
  <constructor-arg type="java.lang.String" value="阿离"/> 
</bean>

set注入

set注入是根据property标签的name属性的值去找对应的setter方法,如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。

package com.wjh.po;

import java.util.*;

/**
 * @author wjh
 * @date 2021/7/16 20:07
 * @Package com.wjh.po
 */
public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbies;
    private Map<String,String> cards;
    private Set<String> games;
    private String wife;
    private Properties properties;

    setXxx
    getXxx
    ....
}
package com.wjh.po;

/**
 * @author wjh
 * @date 2021/7/16 20:06
 * @Package com.wjh.po
 */
public class Address {
    private String province;
    private String city;
    private String county;
    private String detail;

    setXxx
    getXxx
    ....

}

XML配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="address" class="com.wjh.po.Address">
        <property name="province" value="广东省"/>
        <property name="city" value="深圳市"/>
        <property name="county" value="南山区"/>
        <property name="detail" value="腾讯大夏timi工作室666号"/>
    </bean>

    <bean id="student" class="com.wjh.po.Student">

<!--常量注入-->
        <property name="name" value="阿离"/>

<!--bean注入-->
        <property name="address" ref="address"/>

<!--数组注入-->
        <property name="books">
            <array>
                <value>《三国演义》</value>
                <value>《水浒传》</value>
                <value>《红楼梦》</value>
                <value>《西游记》</value>
            </array>
        </property>

<!--List注入-->
        <property name="hobbies">
            <list>
                <value>听歌</value>
                <value>打代码</value>
                <value>小姐姐</value>
            </list>
        </property>

<!--Map注入-->
        <property name="cards">
            <map>
                <entry key="身份证" value="432524200110126736"/>
                <entry key="银行卡" value="12563149924854541138894"/>
            </map>
        </property>

<!--Set注入-->
        <property name="games">
            <set>
                <value>王者荣耀</value>
                <value>LOL</value>
            </set>
        </property>

<!--null注入-->
        <property name="wife">
            <null/>
        </property>

<!--properties注入-->
        <property name="properties">
            <props>
                <prop key="driver">com.mysql.cj.jdbc.Driver</prop>
                <prop key="url">jdbc:mysql://127.0.0.1:3306/mybatis</prop>
                <prop key="username">root</prop>
                <prop key="password">wujiahao269139</prop>
            </props>
        </property>
    </bean>
</beans>

运行结果:
image.png

其它注入

p命名空间注入:

导入约束 : xmlns:p="http://www.springframework.org/schema/p" 
<!--P(属性: properties)命名空间 , 属性依然要设置set方法--> 
<bean id="user" class="com.kuang.pojo.User" p:name="狂神" p:age="18"/>

c命名空间注入:

导入约束 : xmlns:c="http://www.springframework.org/schema/c" 
<!--C(构造: Constructor,需要有参构造器)命名空间 , 属性依然要设置set方法--> 
<bean id="user" class="com.kuang.pojo.User" c:name="狂神" c:age="18"/>