1. 程式人生 > 其它 >Spring 控制反轉 Ioc 的理論推導

Spring 控制反轉 Ioc 的理論推導

技術標籤: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方法,就可以讓程式的主動權從程式設計師手中移交到使用者手中,使用者想用什麼就傳什麼引數就好了!