Spring之IOC

什么是IOC,IOC就是Inversion of Control的首字母,翻譯為控制反轉(zhuǎn),可能你還是不理解,接下來我們先用個例子說明后再回頭解釋。免得越說越糊涂。

  • 新建項目
    本系列Spring介紹使用編譯器為Intellij IDE.
  1. 第一步


    image.png
  2. 第二步


    image.png
  3. 第三步


    image.png
  4. 第四步


    此處一般默認(rèn)即可
  5. 第五步

image.png
  1. 目錄結(jié)構(gòu)介紹

image.png

如果以上沒有java和resources文件可以自己創(chuàng)建。

  • 導(dǎo)入依賴

Spring的核心部分需要導(dǎo)入四個包

  • spring-core
  • spring-expression
  • spring-beans
  • spring-context

在項目的pop.xml中加入以下內(nèi)容

 <!--spring核心-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>5.1.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-expression</artifactId>
      <version>5.1.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.1.1.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.1.1.RELEASE</version>
    </dependency>
  • 加入日志相關(guān),非必須
 <!--日志相關(guān)-->
    <dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.1.1</version>
    </dependency>
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
  • 演示傳統(tǒng)寫法
    雖然上面已經(jīng)導(dǎo)入了spring的一些核心依賴庫,在使用IOC之前我們先看看傳統(tǒng)寫法怎么寫?
  1. 建一個接口類 UserDao
package com.laotunong.spring;

public interface UserDao {

    public void add();
    public void delete();
    public void update();
    public void find();
}

  1. 創(chuàng)建一個實現(xiàn)類,實現(xiàn)UserDao中的四個方法
package com.laotunong.spring;

/**
 * 描述:
 * UserDao實現(xiàn)類
 *
 * @author yang
 * @create 2018-10-30 8:22 AM
 */
public class UserDaoImpl implements UserDao {

    public void add() {
        System.out.println("增加執(zhí)行方法.....");
    }

    public void delete() {
        System.out.println("刪除執(zhí)行方法.....");
    }

    public void update() {
        System.out.println("修改執(zhí)行方法.....");
    }

    public void find() {
        System.out.println("查找執(zhí)行方法.....");
    }
}
  1. 寫一個測試類
import com.laotunong.spring.UserDao;
import com.laotunong.spring.UserDaoImpl;
import org.junit.Test;

/**
 * 描述:
 * Junit測試
 *
 * @author yang
 * @create 2018-10-30 8:23 AM
 */
public class TestDamo {


    @Test
    public void demo() {

//        通過傳統(tǒng)方法,new一個實現(xiàn)類,然后通過接口類接收
        UserDao userDao = new UserDaoImpl();
//        調(diào)用方法
        userDao.add();
        userDao.delete();
        userDao.update();
        userDao.find();

    }

}

運行結(jié)果:


image.png

可以看到上面的方法執(zhí)行,沒有毛病。
可能就有人問,這不是挺好的嗎,接口編程是一直強調(diào)的編程思想啊。
是的,接口編程仍然是需要提倡的編程思想,通過這個例子我們發(fā)現(xiàn)UserDao和UserDaoImpl有一定的依賴關(guān)系,并且UserDaoImpl示例的管理和使用都需要我們介入,比如聲明周期,創(chuàng)建、銷毀等。IOC就是就是基于此產(chǎn)生的。通過IOC我們可以把對象的創(chuàng)建管理都交給Spring容器,需要的時候只管拿來就用。

就像我們餓了一樣,自己買菜,洗菜,下廚做飯,吃完飯還要洗碗??此茮]什么毛病。不是每個人都經(jīng)歷過的正常生活嗎?是的,但是現(xiàn)在我懶得做了,于是我去餐館吃,我不用買菜不用做飯,不用洗碗,我只管吃,吃飽就走。

  • 演示IOC寫法
  1. 在resources下創(chuàng)建一個applicationContext.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">
  1. 配置IOC
    <bean id="userDao" class="com.laotunong.spring.UserDaoImpl"/>
  1. 建一個測試類
@Test
    public void demo1(){

        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDaoImpl userDao = (UserDaoImpl) classPathXmlApplicationContext.getBean("userDao");
        userDao.add();
        userDao.delete();

    }

通過ClassPathXmlApplicationContext()加載applicationContext.xml文件
讀取配置的bean參數(shù)

 <bean id="userDao" class="com.laotunong.spring.UserDaoImpl"/>
id就是相當(dāng)于name,后面要獲取這個對象就通過id獲取
class 是要創(chuàng)建的對象的全路徑

通過getBean(xxx)容器就會根據(jù)給定的id創(chuàng)建對應(yīng)class的對象實例返回。
這樣就得到了一個對象,然后就可以調(diào)用對象中的方法。
這里我們不用去自己new一個對象,而是有容器幫我們創(chuàng)建和管理。

其實這里是非常簡單的IOC的使用,如果自己實現(xiàn)怎么做了,自己動手寫一個IOC需要用到反射,不清楚反射的可以參考:http://www.itdecent.cn/p/060953bbe104

做好預(yù)備知識,下一節(jié)講解IOC的更多配置,以及自己手動去寫一個IOC加載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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