什么是IOC,IOC就是Inversion of Control的首字母,翻譯為控制反轉(zhuǎn),可能你還是不理解,接下來我們先用個例子說明后再回頭解釋。免得越說越糊涂。
- 新建項目
本系列Spring介紹使用編譯器為Intellij IDE.
-
第一步
image.png -
第二步
image.png -
第三步
image.png -
第四步
此處一般默認(rèn)即可 第五步

- 目錄結(jié)構(gòu)介紹

如果以上沒有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)寫法怎么寫?
- 建一個接口類 UserDao
package com.laotunong.spring;
public interface UserDao {
public void add();
public void delete();
public void update();
public void find();
}
- 創(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í)行方法.....");
}
}
- 寫一個測試類
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é)果:

可以看到上面的方法執(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寫法
- 在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">
- 配置IOC
<bean id="userDao" class="com.laotunong.spring.UserDaoImpl"/>
- 建一個測試類
@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加載。



