1. 程式人生 > 其它 >Spring IOC思想(Inversion of Control 控制反轉)

Spring IOC思想(Inversion of Control 控制反轉)

技術標籤:springspring

IOC思想

在接觸spring之前,我們原來的專案中 ,每次使用者想要一些其他的功能,我們就要通過改變原來的程式碼來實現,當代碼量比較大的時候,修改代價非常昂貴。因此IOC思想就出來了。它的本質就是:獲得依賴物件的方式反轉了。

跟以前的專案進行對比:

以前的專案:

Dao層

public interface UserDao {
    void getUser();
}

Dao層實現類DaoImpl

public class UserDaoImpl implements UserDao{
    public void getUser() {
        System.
out.println("預設使用者"); } }

Service層

public interface UserService {
    void getUser();
}

Service層實現類ServiceImpl

public class UserServiceImpl implements UserService{
    //使用者每次增加需求都要改變程式碼
     private  UserDao userDao = new UserDaoImpl();

    public void getUser() {
        userDao.getUser
(); } }

測試類(使用者)

public class MyTest {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        userService.getUser();
    }
}

結果:輸出“預設使用者”

那麼問題來了,使用者想要增加一些其他的功能。
按照以前的思想,我們要重新新增一個dao介面和實現類還要對service層也進行大改,這樣改動是違反了開閉原則的。好的程式是在不動原來程式碼的基礎上對其進行一定的修改,那麼我們上面專案的那種方式就被摒棄了,我們會採用一個setUserDao的方法動態實現值的注入。

利用了IOC思想的新專案:

新增了一個Mysql使用者的功能,想要實現把原來的預設使用者與mysql使用者自由切換。

新的ServiceImpl

public class UserServiceImpl implements UserService{
    //使用者每次增加需求都要改變程式碼
     private  UserDao userDao ;

    public void getUser() {
        userDao.getUser();
    }
    //重點:利用set進行動態實現值的注入
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}

寫了上面的setUserDao的方法後呢,我們就不用每次改Service層的程式碼,直接在測試類裡呼叫這個方法,傳一個物件過來就可以了。

新的測試類

public class MyTest {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();

        //需要強轉才能呼叫,因為setUserDao方法是在UserServiceImpl中,需要它的物件才能呼叫,簡化後是下方aaa處程式碼
        ((UserServiceImpl)userService).setUserDao(new UserDaoMySQLImpl());
        userService.getUser();

        //aaa
        /*UserServiceImpl userService1 = new UserServiceImpl();
        userService1.setUserDao(new UserDaoMySQLImpl());*/
    }
}

測試結果:
在這裡插入圖片描述

這樣,我們可以直接通過setUserDao的方法裡傳不同的dao層實現類的物件來實現對應不同dao層物件的不同的功能,所以說以後新增功能時只需要寫dao層和測試類就可以,減少了對service層的改動。

根據程式碼我們可以看出:
之前,所有的物件都需要程式設計師手動建立,而加入set的動態值注入後,程式被動的接受物件。控制權從程式設計師自己變成了使用者,使用者需要什麼樣的需求,我們可以通過IOC思想很快完成。這就是IOC的思想,跟策略模式有些類似。這只是簡單的思想理解,具體應用肯定不止於此的,希望通過這篇部落格,我們剛學習spring的小白能夠對IOC思想有一個簡單的理解。