控制反轉(IOC)原理推導

IOC原理推導

以前的Web開發

開發者常常會寫:DAO層接口,DAO層實現類;Service層接口,Service層實現類。

比如有這樣四個文件:

    //DAO層接口
    package main.java.dao;
    
    public interface UserDao {
        void getUser();
    }
    //DAO層實現類
    package main.java.dao;
    
    public class UserDaoImp implements UserDao {
        @Override
        public void getUser() {
            System.out.println("getUser");
        }
    }
    //Service層接口
    package main.java.service;
    
    public interface UserService {
        void getUser();
    }
    //Service層實現類
    package main.java.service;
    
    import main.java.dao.UserDao;
    import main.java.dao.UserDaoImp;
    
    public class UserServiceImp implements UserService {
    
        private UserDao userDao = new UserDaoImp();
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }

然後我們仿照用戶來調Service:

    package test.java;
    
    import main.java.service.UserService;
    import main.java.service.UserServiceImp;
    
    public class UserTest {
        public static void main(String[] args) {
            UserService userService = new UserServiceImp();
            userService.getUser();
        }
    }

嗯,一切正常。假如這時用戶新增了一項需求:從MySQL裏獲取User。

我們要新增一個UserDao的實現:

    //MySQL的UserDao實現類
    package main.java.dao;
    
    public class UserDaoMySQLImp implements UserDao {
        @Override
        public void getUser() {
            System.out.println("MySQL getUser");
        }
    }

還要更改Service層的實現類:

    package main.java.service;
    
    import main.java.dao.UserDao;
    import main.java.dao.UserDaoImp;
    import main.java.dao.UserDaoMySQLImp;
    
    public class UserServiceImp implements UserService {
    
        private UserDao userDao = new UserDaoMySQLImp();//改了這裏
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }

試想,如果用戶又需要從Oracle取數據?SQL Server?等等?這對於開發者來說太麻煩了!

新的模式(IOC雛形)

設想,我們如果在Service層的實現類里加入一個對UserDao的Set方法,是不是就可以動態的指定所需的實現類呢?

    //新的Service層實現類(加入了Set方法)
    package main.java.service;
    
    import main.java.dao.UserDao;
    import main.java.dao.UserDaoImp;
    import main.java.dao.UserDaoMySQLImp;
    
    public class UserServiceImp implements UserService {
        private UserDao userDao = new UserDaoMySQLImp();
    
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }

這樣,用戶就可以自己來指定所需的實現類了。實現了控制權從程序猿到用戶的反轉!系統耦合性大大降低!

    //新的用戶調用
    package test.java;
    
    import main.java.dao.UserDaoMySQLImp;
    import main.java.service.UserService;
    import main.java.service.UserServiceImp;
    
    public class UserTest {
        public static void main(String[] args) {
            UserService userService = new UserServiceImp();
            ((UserServiceImp)userService).setUserDao(new UserDaoMySQLImp());//自己選擇實現類
            userService.getUser();
    
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章