簡單理解:
控制反轉就是將代碼的調用權(控制權)從調用方轉移給被調用方(服務提供方)。
解釋一下:
如果我們需要創建某個類,就需要程序員去修改代碼,然后才可以得到想要的類。反轉的意思就是不需要程序員去直接操作代碼,而是通過服務方
(Spring)讓框架的機制幫助程序員獲得想要的對象,而程序員只需要修改配置文件,不用關心對象是怎么創建的。
舉個例子:
1 public class UserServiceImpl implements UserService { 2 private UserDao userDao = new UserDaoImpl(); 3 @Override 4 public void getUser() { 5 userDao.getUser(); 6 } 7 }
如果 UserDao 接口被多個不同的類實現,那么在service層就要多次修改標藍色的代碼。
比如:增加一個 UserDaoMySqlImpl 類去實現 UserDao 接口
1 public class UserDaoMySqlImpl implements UserDao { 2 @Override 3 public void getUser() { 4 System.out.println("MySql獲取用戶數據"); 5 } 6 }
那么如果在service層需要使用這個類,就要修改代碼:
1 public class UserServiceImpl implements UserService { 2 private UserDao userDao = new UserDaoMySqlImpl(); 3 @Override 4 public void getUser() { 5 userDao.getUser(); 6 } 7 }
如果增加一千個類去實現這個接口,那么代碼將被程序員修改一千次,這是很不合理的。
解決方法:
成員變量是UserDao接口類,但是並不去實現它,給一個實現的方法去實現。
1 public class UserServiceImpl implements UserService { 2 private UserDao userDao; 3 // 利用set實現 4 public void setUserDao(UserDao userDao) { 5 this.userDao = userDao; 6 } 7 @Override 8 public void getUser() { 9 userDao.getUser(); 10 } 11 }
這樣我們在調用不同的實現類的時候就可以這么寫代碼:
1 UserServiceImpl service = new UserServiceImpl(); 2 service.setUserDao( new UserDaoOracleImpl() );
總結:
這也是一種反轉,本身如果用戶需要使用某一個服務類,需要程序員修改內部代碼來實現,
現在程序員只需要給用戶提供接口,用戶根據需求填入參數就可以得到想要的類。
之前的主動權在程序,在程序員。
現在的主動權在調用者,就是調用 setUserDao( )方法的人,
程序成為了被動者。
這就是通過定義一個方法,以傳參數的形式來返回一個類對象,而不用在類內部初始化另一個類,降低了代碼的耦合性。
控制反轉IoC(Inversion of Control),是一種設計思想,DI(Dependency Injection)依賴注入是實現IoC的一種方法。
反轉
是程序和IoC容器的反轉
之前如果程序想要獲得某個對象,就直接自己主動去創建,主動權在程序。
有了IoC容器之后,
程序獲取對象的主動權給了IoC容器,程序成為了被動的接收者,
只需要等待容器去創建對象並接收,不需要去主動修改代碼獲得對象。
Spring容器是如何實現的?
控制反轉是一種通過描述(XML或注解)並通過第三方去生產或獲取特定對象的方式。
在Spring中實現控制反轉的是IoC容器,其實現方法是依賴注入(Dependency Injection,DI)。
依賴:程序依賴IoC容器
注入:IoC容器幫助程序注入到某個對象需要的外部資源(比如給對象的變量賦值)
參考自:https://blog.csdn.net/jisuanjiguoba/article/details/81532965