Spring IOC(控制反轉)思想筆記
IOC控制反轉基本理念就是將程式控制權從程式員手中交給用戶自定義,從而避免了因為用戶一個小需求的變化使得程式員需要改動大量代碼,

案例
如果按照之前javaweb的固定方法,寫一個簡單的業務邏輯
-
一個DAO介面
public interface UserDao { public void getUser(); } -
實作DAO介面
public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("獲取用戶資料"); } } -
一個service介面
public interface UserService { public void getUser(); } -
實作service介面
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoImpl(); @Override public void getUser() { userDao.getUser(); } } -
測驗類
@Test public void test(){ UserService service = new UserServiceImpl(); service.getUser(); }這些是原來方式撰寫的基本步驟,如果現在增加需求,在UserServiceImpl中不是需要UserDaoImpl,而是一個新的實作了UserDao介面的UserDaoMySqlImpl
-
新增UserDaoMySqlImpl實作UserDao介面
public class UserDaoMySqlImpl implements UserDao { @Override public void getUser() { System.out.println("MySql獲取用戶資料"); } }如果要去使用這個UserDaoMySqlImpl的話,就需要在UserServiceImpl中修改代碼
-
修改UserServiceImpl
public class UserServiceImpl implements UserService { private UserDao userDao = new UserDaoMySqlImpl();//修改部分 @Override public void getUser() { userDao.getUser(); } } -
如果再增加一個UserDaoOracleImpl
public class UserDaoOracleImpl implements UserDao { @Override public void getUser() { System.out.println("Oracle獲取用戶資料"); } }如果又要使用這個dao,則又需要去service中改變代碼,假設專案十分龐大,修改一個dao可能涉及幾十幾百行代碼,我們的作業量就會非常大,程式耦合性也非常高,
如何解決問題
-
在UserServiceImpl中增加一個set方法
public class UserServiceImpl implements UserService { private UserDao userDao; // 利用set方法,讓呼叫者自行選擇需要的dao public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getUser() { userDao.getUser(); } }- 新的測驗類
@Test public void test(){ UserServiceImpl service = new UserServiceImpl(); service.setUserDao( new UserDaoMySqlImpl() );//自行選擇UserDaoMySqlImpl service.getUser(); //如果又要用UserDaoOracleImpl,也是可以由呼叫者自行選擇 //service.setUserDao( new UserDaoOracleImpl() ); //service.getUser(); }
之前所有的改變都是有程式員去控制,現在將改變的主動權交給了呼叫者/用戶,程式也不用去管怎么創建和呼叫了,使得程式員可以專心實作業務,只實作一個提供服務的介面,不再管理物件的創建,也降低了代碼之間的耦合度,當需求改變時也不必修改大量代碼
IOC思想
控制反轉IoC(Inversion of Control),是一種設計思想,DI(依賴注入)是實作IoC的一種方法,沒有IoC的程式中 , 我們使用面向物件編程 , 物件的創建與物件間的依賴關系完全硬編碼在程式中,物件的創建由程式自己控制,控制反轉后將物件的創建轉移給第三方,
控制反轉:可以理解為控制 物件創建 的 主動權 反轉了,原來物件創建要由我們撰寫的程式控制,主動權在程式手里,控制反轉后就將創建物件的主動權移交給第三方,這樣可以降低程式代碼間的耦合性,減少了修改代碼的作業量,



在Spring中,IOC思想的體現就是依賴注入,在xml檔案中或者使用注解創建物件交由IOC容器管理,之后獲取物件就不再通過new 物件,而是通過組態檔從IOC容器中獲取物件,之后修改就不需要改動程式,而只需要在xml組態檔中進行修改 ,將物件交由Spring去創建、管理、裝配,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/244275.html
標籤:java
上一篇:2021-01-03
