(這篇只說ioc)對於spring初學者來說,可能對ioc比較模糊,問別人“什麼叫做ioc,它做了些什麼”,得到的答案 無非是“在項目中,要用到一個類的方法或屬性時我們都是通過new創建,用了ioc,我們不用自己new,而是交給ioc幫我們創建。”這樣的回答沒有錯,若是再講一下底層實現,豈不是更明瞭。。。(躲開,我要裝X了,)--(大佬請無視---)
-
spring核心之一ioc(控制反轉)
ioc(控制反轉):(Inversion of Control,縮寫爲IoC)是面向對象編程中的一種設計原則,降低代碼之間的耦合度,spring核心之一。
我們要用到一個類的方法或者屬性時,先說一下我們之前的幾種用法。
- 通過new創建對象
public class UserService(){ public void add(){ System.out.println("原始方法"); } } public class UserController(){ //之前我們都是通過 new 來創建UserService 來獲取方法 UserService us = new UserService(); us.add(); } /** *這樣有個缺陷:如果這個UserService類名或者裏面的方法改變了, *那我們的controller是不是也要跟着去改動 * 也就是我們常說的耦合度較高 **/ //slh
- 工廠模式
public class UserService{ public void add(){ //方法體 } } public class UserController{ UserService us = Factory.getService(); us.add(); } public class Factory{ //提供返回service對象的方法 private static UserService getService(){ return new UserService; } } //但是這樣雖然讓service和controller之間耦合降低了, //但是controller和 factory 之間又有了新的耦合 //slh
- ioc(低耦合)實現
<1>創建XML配置文件
<bean id="UserService" class ="com.sh.slh.UserService"/>
<2>創建工廠類 使用dom4j 解析配置文件+反射//返回UserService的方法 public static UserService getService(){ //1.dom4j 解析文件 //根據xml的id值,得到對應的class屬性值 String classValue = "class屬性值"; //反射創建類對象 Class cl = Class.forName(classValue); //instance() 創建類對象 UserService us = cl.newInstance(); return us; } //降低了類間的耦合度 //slh
ioc 的底層實現完畢。
除了第一個是原始 需用new關鍵字來創建對象,通過對象 才能 獲取對應的方法或者屬性。
第二種 是有了新的耦合
- ioc(低耦合)實現