IOC 即控制反轉。將對象的控制權反過來交給spring進行管理。實現了對象與對象之間的解耦合。
什么是控制?控制權指的是類的對象的創建和使用的權利。 比如A類和B類,在A類中創建B類對象,並調用B類的方法,那么我們稱A類有B類的控制權。
而控制反轉即A類將創建的B的操作交給spring來做。A只需要向spring 獲取B對象即可。
它的好處是,對象的構建如果依賴非常多的對象,且層次很深,外層在構造對象時很麻煩且不一定知道如何構建這么多層次的對象,IOC幫我們管理對象的創建,只需要在配置文件里指定如何創建,每一個對象的配置文件都在類編寫的時候指定了,所以最外層對象不需要關心深層次對象如何創建的,前人都已經寫好了;
例如:
定義一個接口ByeService,里面有一個bye方法,並創建兩個實現類(中文和英文的),通過spring將對象注入UserAction類中;
我的目錄為(僅供參考):
1、先寫兩個實現類;
ChineseService.java中的代碼為: package before; public class ChineseService implements ByeService{ @Override public void sayBye(){ System.out.println("Today is 520 but I more like play code"); } }
EnglishService.java中的代碼為: package before; public class EnglishService implements ByeService { @Override public void sayBye(){ System.out.println("今天是520,但是我更喜歡敲代碼"); } }
2、定義一個接口ByeService,目的是讓兩個實現類去實現這個接口;
ByeService.java中的代碼為: package before; public interface ByeService { void sayBye(); }
3、寫一個spring配置文件applicationContext.xml;
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"> <bean class="before.ChineseService" id="chineseService"></bean> <bean class="before.EnglishService" id="englishService"></bean> <bean class="spring.UserAction" id="userAction"> <property name="byeService" ref="englishService"></property> </bean> </beans>
4、寫一個UserAction去測試是否成功;
UserAction.java中的代碼為: package spring; import before.ByeService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserAction { private ByeService byeService; public void bye(){ byeService.sayBye(); } public void setByeService(ByeService byeService){ this.byeService=byeService; } public static void main(String[] args) { ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/applicationContext.xml"); UserAction userAction= (UserAction) applicationContext.getBean("userAction"); userAction.bye(); } }
測試結果為: