在Spring的簡介中我們知道了Spring的核心是控制反轉(ICO)和麵向切麵編程(AOP),我們不直接對ICO進行學習,而是先學習ICO的理論推導。 這是我一個maven項目的結構。 UserDao: package com.jms.dao; public interface UserDao { ...
在Spring的簡介中我們知道了Spring的核心是控制反轉(IoC:Inverse of Control)和麵向切麵編程(AOP:Aspect Oriented Programming),我們不直接對IoC進行學習,而是先學習IoC的理論推導。
這是我一個maven項目的結構。
UserDao:
package com.jms.dao; public interface UserDao { void getUser(); }
UserDaoImpl:
package com.jms.dao; public class UserDaoImpl implements UserDao{ @Override public void getUser() { System.out.println("this is UserDaoImpl"); } }
UserDaoMysqlImpl:
package com.jms.dao; public class UserDaoMysqlImpl implements UserDao{ @Override public void getUser() { System.out.println("this is UserDaoMysqlImpl"); } }
UserDaoOracleImpl:
package com.jms.dao; public class UserDaoOracleImpl implements UserDao{ @Override public void getUser() { System.out.println("this is UserDaoOracleImpl"); } }
UserService:
package com.jms.service; public interface UserService { void getUser(); }
UserServiceImpl:
package com.jms.service; import com.jms.dao.UserDao; import com.jms.dao.UserDaoImpl; public class UserServiceImpl implements UserService{ private UserDao userDao = new UserDaoImpl(); @Override public void getUser() { userDao.getUser(); } }
這樣寫當用戶有不同需求時我們就要去原來的代碼中進行修改:
private UserDao userDao = new UserDaoImpl(); //private UserDao userDao = new UserDaoMysqlImpl(); //private UserDao userDao = new UserDaoOracleImpl();
如果代碼量十分龐大,修改一次的成本代價就十分昂貴。
有沒有什麼辦法解決呢?
我們可以用一個set方法實現:
package com.jms.service; import com.jms.dao.UserDao; public class UserServiceImpl implements UserService{ private UserDao userDao; //利用set實現動態值的註入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getUser() { userDao.getUser(); } }
雖然只是簡單的幾行代碼,但是發生了根本上的變化。
之前程式具有主動性,能主動控制對象,對象由程式創建;set註入後,程式不再有主動性,變為被動地接收對象。
這種思想,就從本質上解決了問題,程式員不用再去管理對象的創建了。系統耦合性大大降低,可以更加專註在業務實現上。
這是IoC的原型。
(本文僅作個人學習記錄用,如有紕漏敬請指正)