IOC理論實現
- UserDao接口
public interface UserDao {
void say();
}
- UserDaoImpl實現類
public class UserDaoImpl implements UserDao {
public void say() {
System.out.println("我想使用默認數據庫");
}
}
- UserService接口
public interface UserService {
void say();
}
- UserServiceImpl實現類
如以上代碼 如果當前業務跟代碼邏輯一樣 沒有任何問題 輸出 我想使用默認數據庫
如果后面有需求 我想使用MySQL
數據庫Oracle
數據庫等等 有一種方法 service實現類多寫幾個 實現MySQL
數據庫Oracle
數據庫 再調用對應的接口即可 如果有成千上萬個類似的需求
是不是要寫成千上萬個?還有一種 將userDao的引用指向業務想要的 那么如果頻繁修改 業務邏輯代碼也能相對應的改 麻煩不說 且還容易出問題
所以 為了解決工作不便 需要轉變一下思路 能不能讓private UserDao userDao
動態化 就像我是mysql userDao
就是Mysql 我是oracle userDao
就是oracle
新增MySQL Oracle業務
public class UserMysqlImpl implements UserDao {
public void say() {
System.out.println("我想使用Mysql數據庫");
}
}
public class UserOracleImpl implements UserDao {
public void say() {
System.out.println("我想使用oracle數據庫");
}
}
測試
如圖所示 就是這樣一個改動 加了一個set
方法 整個代碼邏輯就變得很清楚 需求是什么 我們就傳入什么
以前userDao
的控制完全在程序本身
設置的什么 就是什么 沒有可擴展性
現在對象的創建或者說需求的實現發生了反轉
程序被動的接收userDao
的值 程序不需要知道userDao
什么時候創建的 什么時候傳入進來的 只需要把最終的結果返回出來就好了
IOC
控制反轉 控制什么反轉了? 創建對象的控制權反轉了 以前創建對象的主動權和創建時機由程序把握
現在這種權力
反轉給其他方
了