在这一节我们将学习更多spring配置文件中的的标签以及属性的使用。

DI 解决的问题

依赖注入解决的是在bean对象创建时,对象中的参数的初始化问题。我们知道类中包含了属性和方法,在一般的程序中我们在new的时候 提供参数来进行类属性的初始化,而在spring中类的创建的权利交给spring框架,那么当我们使用的类需要使用参数进行初始化的时候要怎么办呢?我们只能通过在配置文件中配置来进行解决,这就是本节学习的有关依赖注入的标签和属性所要解决的问题

依赖注入的方法

  • 构造函数注入
  • set方法注入
  • 通过注解提供(后面学习)

注入的数据类型

  • 基本类型和String类型
  • 其他bean类型(在配置文件中或注解中配置过的bean)
  • 复杂类型(也可以说是集合类型,如list,set,map)

构造函数注入

使用constructor-arg标签:
标签出现的位置:bean标签的内部
标签拥有的属性:

  • type 参数的类型,如java.lang.String,java.lang.Integer
  • index 参数在构造杉函数中出现的位置,如0,1,2
  • name 参数在构造函数中的名称,(用这个来定位是最方便的)
    =============以上三个用于指定给构造函数中的那个标签赋值========
  • value 基本类型的参数的值
  • ref 复杂类型的bean对象的id值
public class AccountService implements IAccountService {

    private String name;
    private int age;
    private Date birthday;

    public AccountService(String name, int age, Date birthday){
       this.name = name;
       this.age = age;
       this.birthday = birthday;
    }

    public void saveAccount() {

        System.out.println("AccountService: saveAccount");
    }
}
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "now" class="java.util.Date"> </bean>
    <bean id = "accountService" class="com.lujuan.service.impl.AccountService" scope="singleton">
        <constructor-arg name="name" value="lujuan"> </constructor-arg>
        <constructor-arg name="age" value="18"> </constructor-arg>
        <constructor-arg name="birthday" ref="now"> </constructor-arg>
    </bean>
</beans>

set方法注入

在这个方法注入中需要类中有set方法,然后在bean标签内部使用property标签。
使用property标签:
标签出现的位置:bean标签内部
标签拥有的属性:
-name 类中的setXXX函数中的XXX,同时会将第一个大写字母进行小写
-value 基本类型的参数的值
-ref 复杂类型的bean对象的id值

public class AccountService implements IAccountService {

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    private String name;
    private int age;
    private Date birthday;
}
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id = "now" class="java.util.Date"> </bean>
    <bean id = "accountService" class="com.lujuan.service.impl.AccountService" scope="singleton">
        <!--<constructor-arg name="name" value="lujuan"> </constructor-arg>-->
        <!--<constructor-arg name="age" value="18"> </constructor-arg>-->
        <!--<constructor-arg name="birthday" ref="now"> </constructor-arg>-->
        <property name="name" value="lujuan"> </property>
        <property name="age" value="18"> </property>
        <property name="birthday" ref="now"> </property>
    </bean>

基于此,我们已经属性了两种依赖注入的方式。在上面的注入中我们注入的都是基本类型或者bean对象,那么如何注入类似,array、list set map properties这些复杂类型呢,我们接着往下面看。

复杂类型/集合类型注入

集合类型的注入需要使用新的诸如list、set、map、array、props这样的新的标签,并且要放置在constructor-arg标签或者property标签的内部,constructor-arg和property标签仅保留name属性即可,同时对于list、set、array由于结构类似,三种类型可以互换,map和props结构类似可以互换。废话不多说我们直接可以看代码。

public class AccountService implements IAccountService {


    public AccountService(String[] myStrs, List<String> myList, Set<String> mySet, Map<String, String> myMap, Properties myPro) {
        this.myStrs = myStrs;
        this.myList = myList;
        this.mySet = mySet;
        this.myMap = myMap;
        this.myPro = myPro;
    }

    private String[] myStrs;
    private List<String> myList;
    private Set<String> mySet;
    private Map<String, String> myMap;
    private Properties myPro;



    public void saveAccount() {

        System.out.println("AccountService: saveAccount");
    }
}
<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id = "now" class="java.util.Date"> </bean>
    <bean id = "accountService" class="com.lujuan.service.impl.AccountService" scope="singleton">
        <constructor-arg name="myStrs">
            <array>
                <value> AAA </value>
            </array>
        </constructor-arg>
        <constructor-arg name="myList">
            <list>
                <value>AAA</value>
            </list>
        </constructor-arg>
        <constructor-arg>
            <set>
                <value>AAA</value>
            </set>
        </constructor-arg>
        <constructor-arg name="myMap">
            <map>
                <entry key="AAA" value="AAAA"> </entry>
            </map>
        </constructor-arg>
        <constructor-arg name="myPro">
            <props>
                <prop key="AAA"> </prop>
            </props>
        </constructor-arg>

    </bean>
</beans>

对于set方法类型的注入使用和上面相同的方法,只不过要把constructor-arg标签换成property标签。

当然我们上面只是用了array、set、list中的value属性以及map、props中的entry、prop属性,还有一下其他属性,比如ref用来引用bean对象,这些我们可以作为后期扩展知识进行学习,本期主要学习的是依赖注入的概念。