Spring framework之配置文件实现依赖注入的方式

 setter注入:就是用set方法向类中传递数据。

      引用类型:在类中为传入的属性提供对应的set方法,然后在配置文件中使用property标签 name属性指定哪个属性,ref属性注入。传入多个数据时,写多个property标签就可以了。

public class bookServiceImpl implements bookService{

   
    bookDao bookDao;
    userDao userDao;


    @Override
    public void save() {
        bookDao.save();
        System.out.println("bookService....");
    }

    public void setBookDao(bookDao bookDao) {
        this.bookDao = bookDao;
    }

    public void setUserDao(org.example.dao.userDao userDao) {
        this.userDao = userDao;
    }
}

         配置文件:

<bean id="bookDao" class="org.example.dao.impl.bookDaoImpl"/>
    <bean id="userDao" class="org.example.dao.impl.userDaoImpl"/>


    <bean id="bookService" class="org.example.service.impl.bookServiceImpl">
        <property name="bookDao" ref="bookDao"/>
        <property name="userDao" ref="userDao"/>
    </bean>

    简单类型:在类中为属性提供set方法,然后配置文件中使用property标签,name属性指定为哪个属性赋值,value属性是值的内容。

package org.example.dao.impl;

import org.example.dao.bookDao;

public class bookDaoImpl implements bookDao {

    public bookDaoImpl() {
        System.out.println("bookDaoImpl被new");
    }


    @Override
    public void save() {
        System.out.println("bookDao...."+count+"   "+book);
    }

    private int count;
    private String book;

    public void setCount(int count) {
        this.count = count;
    }

    public void setBook(String book) {
        this.book = book;
    }
}

             配置文件:

<bean id="bookDao" class="org.example.dao.impl.bookDaoImpl" init-method="init" destroy-method="destroy">
        <property name="book" value="mysql"/>
        <property name="count" value="2"/>
    </bean>

下面是另一种依赖注入的方式:构造器注入:就是用构造方法向类中传递参数

   引用类型:把要传入的属性作为形参写入构造方法,在配置文件中bean标签中用constructor-arg标签代替原来的property标签,属性一样。name属性必须为构造方法中形参的名字。

package org.example.service.impl;

import org.example.dao.bookDao;
import org.example.service.bookService;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class bookServiceImpl2 implements bookService{

    bookDao bookDao;

    public bookServiceImpl2(bookDao bookDao) {
        this.bookDao = bookDao;
    }

    @Override
    public void save() {
        bookDao.save();
        System.out.println("bookService....");
    }
}

        配置文件:

    <bean id="bookDao2" class="org.example.dao.impl.bookDaoImpl2">
    </bean>
    <bean id="bookService2" class="org.example.service.impl.bookServiceImpl2">
        <constructor-arg name="bookDao" ref="bookDao2"/>
    </bean>

  简单类型:把需要传入的属性作为形参写入构造方法,构造文件中,一样用contructor-arg标签代替property标签,用value属性指明传入的具体的值。

package org.example.dao.impl;

import org.example.dao.bookDao;

public class bookDaoImpl2 implements bookDao {

    private int count;

    private String book;
    public bookDaoImpl2(int count, String book) {
        this.count = count;
        this.book = book;
    }


    @Override
    public void save() {
        System.out.println("bookDao...."+count+"  "+book);
    }
}

        配置文件:

<bean id="bookDao2" class="org.example.dao.impl.bookDaoImpl2">
        <constructor-arg name="book" value="mysql2"/>
        <constructor-arg name="count" value="10"/>
    </bean>

 因为这种注入依赖的方式name属性必须要与set方法的方法名或者构造方法中形参的属性名一致,所以我们可以用type属性来替换name属性

<bean id="bookDao2" class="org.example.dao.impl.bookDaoImpl2">
        <constructor-arg type="java.lang.String" value="mysql2"/>
        <constructor-arg type="int" value="10"/>
    </bean>

type属性用于指明要赋值的属性的基本类型。

   要用type属性进行赋值,前提是形参中各个属性的基本类型都不一样。

如果想解决多个属性的基本类型不能重复的问题,用位置来解决参数匹配

<bean id="bookDao2" class="org.example.dao.impl.bookDaoImpl2">
        <constructor-arg index="1" value="mysql2"/>
        <constructor-arg index="0" value="10"/>
    </bean>

     index属性来告诉它参数的位置,第一个参数的位置为0。

依赖注入方式选择:

   1、强制依赖使用构造器进行,使用setter注入有概率不进行导致null对象的出现。强制依赖指的是该bean运行必须要有的依赖。

   2、可选依赖使用setter注入,灵活性强。

   3、spring倡导使用构造器

   4、有必要时可以俩者同时使用,构造器完成强制依赖注入,setter注入完成可选依赖注入。

   5、自己开发的模块推荐使用setter注入。(重点)