初識spring01 - 控制反轉 IOC思想的體會
阿新 • • 發佈:2020-08-26
- 如果要呼叫UserDaoMysqlImpl介面實現類,那麼需要在UserServiceImpl這個業務介面實現類,改變private UserDao userDao= new UserDaoImpl();這句程式碼為private UserDao userDao= new UserDaoMysqlImpl();
- 由於每一次呼叫不同的dao介面實現類,都要在業務介面實現類UserServiceImpl做出更改,很不方便,顯得不靈通
- 因此我們採用另一種方式【也就是類似IOC的原型思想?】用set來進行動態實現值的注入!使得程式不再具有主動性,它被動地接受物件
- 這種思想從本質上解決了問題,程式設計師不需要再管理物件的建立,系統的耦合性大大降低~這是IOC的原型!
1.dao層 1.1、UserDao介面 package com.lobster.dao; public interface UserDao { void getUser(); } 1.2、UserDaoImpl介面實現類 package com.lobster.dao; public class UserDaoImpl implements UserDao{ public void getUser() { System.out.println("預設獲取使用者的資料"); } } 1.3、UserDaoMysqlImpl介面實現類 package com.lobster.dao; public class UserDaoMysqlImpl implements UserDao { public void getUser() { System.out.println("Mysql輸出"); } } 2.service層 2.1、UserService業務介面 package com.lobster.service; public interface UserService { void getUser(); } 2.2、UserServiceImpl業務介面實現類 package com.lobster.service; import com.lobster.dao.UserDao; import com.lobster.dao.UserDaoImpl; import com.lobster.dao.UserDaoMysqlImpl; public class UserServiceImpl implements UserService { private UserDao userDao= new UserDaoImpl() ; public void getUser() { userDao.getUser(); } } 3.測試 import com.lobster.service.UserService; import com.lobster.service.UserServiceImpl; public class MyTest { public static void main(String[] args) { //使用者實際呼叫的是業務層,不需要接觸dao UserService userService = new UserServiceImpl(); //列印輸出的會是dao層 userService.getUser(); } } ======================================== 以IOC的思想來做,利用set動態實現值的注入 dao層的UserDao介面和兩個介面實現類UserDaoImpl、UserDaoMysqlImpl以及UserService業務介面跟上面的一樣不需改變, 只改變UserServiceImpl和測試類即可 UserServiceImpl業務介面實現類 package com.lobster.service; import com.lobster.dao.UserDao; public class UserServiceImpl implements UserService { private UserDao userDao; //使用set動態實現值的注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void getUser() { userDao.getUser(); } } 測試 import com.lobster.dao.UserDaoImpl; import com.lobster.service.UserService; import com.lobster.service.UserServiceImpl; public class MyTest { public static void main(String[] args) { //使用者實際呼叫的是業務層,不需要接觸dao UserService userService = new UserServiceImpl(); ((UserServiceImpl) userService).setUserDao(new UserDaoImpl()); //列印輸出的會是dao層 userService.getUser(); } } ================================ 如果要呼叫的是UserDaoMysqlImpl,只需要在測試類中將**((UserServiceImpl) userService).setUserDao(new UserDaoImpl());**更改為((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl()); **也就是說不需要再去動UserServiceImpl這個業務介面實現類,只需要在測試類中稍作改變即可!**