淺談Spring的IOC和DI

0.前言


本文主要想闡述的問題如下:

  • 什么是控制反轉(zhuǎn)?
  • 什么是依賴注入?
  • 它們之間有什么關(guān)系?

1.Spring IOC Demo


為了方便理解,會通過一個Demo來闡述Spring IOC,DI的含義和它們之間的關(guān)系。先看Demo。

  1. 定義用戶實體類 User.java
public class User {

  private int id;
  private String name;

  public int getId() {
      return id;
  }

  public void setId(int id) {
      this.id = id;
  }

  public String getName() {
      return name;
  }

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

}
  1. 定義數(shù)據(jù)訪問接口UserDao.java
public interface UserDao {
  public void add(User user);
}
  1. 定義UserDao.java實現(xiàn)類UserDaoImpl.java
public class UserDaoImpl implements UserDao {

  @Override
  public void add(User user) {
      System.out.println("add user!");
  }

}
  1. 定義業(yè)務邏輯接口UserService.java
public class UserService {
  private UserDao userDao;

  public UserDao getUserDao() {
      return userDao;
  }

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

}

beans.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="u" class="com.syf.dao.impl.UserDaoImpl">
  </bean>

  <bean id="userService" class="com.syf.service.UserService">
      <property name="userDao" ref="u"/>
  </bean>

  <!-- more bean definitions go here -->

</beans>
  1. 測試類UserService.java
public class UserServiceTest {

  @Test
  public void testAdd() throws Exception{
      ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
      UserService svc = (UserService) applicationContext.getBean("userService");
      User u = new User();
      u.setId(1);
      u.setName("name");
      svc.add(u);
  }
}

2.什么是控制反轉(zhuǎn):


控制反轉(zhuǎn)(Inversion of Control)是一種是面向?qū)ο缶幊讨械囊环N設計原則,用來減低計算機代碼之間的耦合度。其基本思想是:借助于“第三方”實現(xiàn)具有依賴關(guān)系的對象之間的解耦。
簡單的說,原來耦合的各個類,通過IOC容器實現(xiàn)解耦。由于引進了IOC容器,使得A、B、C、D這4個對象沒有了耦合關(guān)系,齒輪之間的傳動全部依靠“第三方”了,全部對象的控制權(quán)全部上繳給“第三方”IOC容器。


齒輪_耦合關(guān)系.jpg

如上圖所示,對象A依賴于對象B,那么對象A在初始化或者運行到某一點的時候,自己必須主動去創(chuàng)建對象B或者使用已經(jīng)創(chuàng)建的對象B。無論是創(chuàng)建還是使用對象B,控制權(quán)都在自己手上。


齒輪_解耦合.jpg

如上圖所示,由于IOC容器的加入,對象A與對象B之間失去了直接聯(lián)系,所以,當對象A運行到需要對象B的時候,IOC容器會主動創(chuàng)建一個對象B注入到對象A需要的地方。
在demo里, UserService有一個userDao對象,
  • userDao原來初始化是自己控制,現(xiàn)在控制在IOC容器中。
  • userDao原來我們控制的是它的實現(xiàn),現(xiàn)在控制的是它的抽象。

3.什么是依賴注入:


依賴注入就是將實例變量傳入到一個對象中去(Dependency injection means giving an object its instance variables)。
拿demo舉個例子:

  • UserService有一個userDao對象,我們只設置了userDao的get和set方法,并沒有new一個userDao對象,它的初始化控制在IOC容器里,是由容器注入。
  • UserServiceTest的UserService對象svc,也是拿bean的時候只通過名字來拿,由IOC控制,叫依賴注入。

注入方法

  • setter注入:userDao的注入。
  • 接口注入:不常用。
  • 構(gòu)造方法注入,比如可以在userService加入一個構(gòu)造方法,然后在配置文件里把 <property name="xxx" ref="xxx"/> 改為<constructor-arg type = "xxx" value ="xxx"/>。
  1. 控制反轉(zhuǎn)和依賴注入的關(guān)系
  • 控制反轉(zhuǎn)是一種思想
  • 依賴注入是一種設計模式

補充


  • Scope
    singleton: 單例,默認,兩次取都是同一個,在Spring的IoC容器中只存在一個對象實例,所有該對象的引用都共享這個實例。demo中的bean都是singleton。
    prototype: 原型 ,重新造一個,action 推薦用這個,每個請求方可以得到自己專有的一個對象實例。
    http://www.itdecent.cn/p/ca816b4beccf
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容