1. 程式人生 > >spring依賴注入的兩種方式

spring依賴注入的兩種方式

依賴注入的兩種方式:

網上說的三種注入方式中的介面注入在官方的文件中已經沒有了(spring4.3),所以現在的依賴注入的方式有兩種。

  • 構造方法注入: 通過呼叫帶引數的構造方法來實現,每一個引數都代表是一個依賴。呼叫(注入)的物件通過在被注入物件中的構造方法中宣告的引數列表讓容器知道他要依賴哪些物件,然後spring容器檢查被注入物件的構造方法,需要哪些物件,接著進行注入。

新建service包,新建UserService介面定義服務方法:

package com.demo.service;

/**
 * Created with IDEA
 *
 * @author DuzhenTong
 * @Date
2018/3/26 * @Time 19:20 */
public interface UserService { public void login(); }

新建dao包,新建UserDao類

package com.demo.dao;

/**
 * Created with IDEA
 *
 * @author DuzhenTong
 * @Date 2018/3/26
 * @Time 19:18
 */
public class UserDao {
    public void login() {
        System.out.println("使用者登入!!!");
    }
}

新建impl包,新建UserService的實現類UserServiceImpl

package com.demo.impl;

import com.demo.dao.UserDao;
import com.demo.service.UserService;

/**
 * Created with IDEA
 *
 * @author DuzhenTong
 * @Date 2018/3/26
 * @Time 19:21
 */
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public
UserServiceImpl(UserDao userDao) { this.usrDao = userDao; } @Override public void login() { userDao.login(); } }

spring的配置檔案如下:

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

    <bean id="UserServiceImpl" class="com.demo.impl.UserServiceImpl">
    <constructor-arg>
    <ref bean="userDao" />
    </constructor-arg>
    </bean>

    <bean id="userDao" class="com.demo.dao.UserDao" />

</beans>

新建測試類:

package com.demo.test;

import com.demo.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Created with IDEA
 *
 * @author DuzhenTong
 * @Date 2018/3/26
 * @Time 19:33
 */
public class Test {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) app.getBean("UserServiceImpl");
        userService.login();
    }
}

執行測試類Test,輸出:使用者登入!!!

  • setter注入:當前物件只需要為依賴物件所對應的屬性新增相應的setter方法,spring容器通過setter方法將對應的依賴物件設定到被注入物件。

修改UserServiceImpl類:加上對應的set方法

package com.demo.impl;

import com.demo.dao.UserDao;
import com.demo.service.UserService;

/**
 * Created with IDEA
 *
 * @author DuzhenTong
 * @Date 2018/3/26
 * @Time 19:21
 */
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void login() {
        userDao.login();
    }
}

註釋掉spring配置檔案中之前的bean標籤,加上

<bean id="UserServiceImpl" class="com.demo.impl.UserServiceImpl">
        <property name="userDao" ref="userDao"/>
    </bean>
    <bean id="userDao" class="com.demo.dao.UserDao"/>

其他不變,執行Test類,得到和之前一樣的輸出結果

我們看到上面的所有程式碼都沒有使用new建立例項,其實spring的ioc容器已經幫我們建立好了。

什麼時候建議選擇構造注入?什麼時候建議選擇setter注入?

  • 使用強依賴的時候選擇構造注入,因為構造注入每次都是初始化好了之後才返回給呼叫的程式碼。

  • setter注入主要應用於可選的依賴關係,通常要在相關類的內部關聯合理的預設值。否則在使用相關依賴的地方一定要執行非空檢查。Setter注入的一個好處是後續可以使用setter方法來重新配置或注入相關依賴。 注意,可以使用 setter方法上的@Required註釋來使該屬性成為必需的依賴項。