Spring 控制反轉 Ioc 的理論推導
阿新 • • 發佈:2021-01-30
技術標籤:SpringJavaWebjavaspringioc
暫且不看Ioc
按照以前開發的套路,先寫一個小例子:
新建一個專案,建立com.wzq.dao
包,寫一個UserDao
介面:
package com.wzq.dao;
public interface UserDao {
void getUser();
}
在此包下新建一個預設的實現類,輸出一句話
package com.wzq.dao;
public class UserDaoImpl implements UserDao{
public void getUser() {
System. out.println("正在使用預設方式讀取User...");
}
}
現在建立com.wzq.service
包,寫一個介面:
package com.wzq.service;
public interface UserService {
void getUser();
}
新建實現類:
package com.wzq.service;
import com.wzq.dao.UserDao;
import com.wzq.dao.UserDaoImpl;
public class UserServiceImpl implements UserService {
private UserDao dao = new UserDaoImpl();
public void getUser() {
dao.getUser();
}
}
測試:
import com.wzq.service.UserService;
import com.wzq.service.UserServiceImpl;
import org.junit.Test;
public class MyTest {
@Test
public void Test1(){
UserService service = new UserServiceImpl();
service.getUser();
}
}
輸出結果:
如果現在使用者不想用預設方式獲取資料
,想用MySql
獲取資料咋辦?按照以前的套路肯定是再建立一個MySql
關於UserDao
介面的實現類嘍:
package com.wzq.dao;
public class UserDaoMySqlImpl implements UserDao {
public void getUser() {
System.out.println("正在使用MySQL讀取User...");
}
}
然後再在UserServiceImpl
實現類中更改獲取的物件,最後測試:
成功了,那如果說:使用者現在想用Sql Server
呢,繼續加唄,繼續改service
唄,那如果使用者想用oracle
呢?繼續加唄,繼續改service
唄……那如果使用者想…………………………好了打死使用者吧!!!
總而言之,用這樣的方式,每次都需要修改service
層的程式碼,好麻煩,所以為了解決這個問題,可以在UserServiceImpl
中加一個set
方法:
//利用set進行動態實現值的注入!
public void setUserDao(UserDao dao) {
this.dao = dao;
}
現在測試的時候,只需要呼叫這個方法傳遞想要用的dao
層實現類即可:
@Test
public void Test1(){
UserService service = new UserServiceImpl();
((UserServiceImpl) service).setUserDao(new UserDaoMySqlImpl());
service.getUser();
}
這就是控制反轉Ioc
的思想!通過在service
層設定一個set
方法,就可以讓程式的主動權從程式設計師
手中移交到使用者
手中,使用者想用什麼就傳什麼引數就好了!