1. 程式人生 > 實用技巧 >初識spring01 - 控制反轉 IOC思想的體會

初識spring01 - 控制反轉 IOC思想的體會

  • 如果要呼叫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這個業務介面實現類,只需要在測試類中稍作改變即可!**