天天看點

IOC控制反轉思想IOC控制反轉

IOC控制反轉

控制反轉理論思想

傳統的開發需要程式員自己手動的new執行個體化一個對象,但這種模式如果使用者需求發生改變往往會需要重新修改代碼,例如:

public interface UserDao {
    void getUser();
}


public class UserDaoImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("預設擷取使用者資料");
    }
}
//使用者需求改變,增加UserDao的實作
public class UserMysqlDaoImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("mysql擷取使用者資料");
    }
}

public class UserOracleDaoImpl implements UserDao {
    @Override
    public void getUser() {
        System.out.println("Oracel擷取使用者資料");
    }
}

public interface UserService {
    void getUser();
}

public class UserServiceImpl implements UserService {
    //這裡寫死了
    private UserDao userDao = new UserDaoImpl();//使用者需求改變每次都需要重新修改執行個體化類
    //private UserDao userDao1 = new UserMysqlDaoImpl();
    //private UserDao userDao2 = new UserOracleDaoImpl();
    @Override
    public void getUser() {
        //userDao.getUser();
       // userDao1.getUser();
        userDao2.getUser();
    }
}




           

而運用IOC思想理論用set動态注入,就可避免這種情況,代碼如下:

public class UserServiceImpl implements UserService {
//    private UserDao userDao = new UserDaoImpl();
    private UserDao userDao;	//這裡不寫死,通過set注入設定
    
    public void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    
    @Override
    public void getUser() {
        userDao.getUser();
    }
}

public class MyTest {
    public static void main(String[] args) {
        //使用者實際調用業務層,不接觸dao層
        UserService userService = new UserServiceImpl();
        ((UserServiceImpl) userService).setUserDao(new UserOracleDaoImpl());
        userService.getUser();
    }
}
           

差別是原來使用者需求改變,需要修改業務層的執行個體化代碼(new代碼),主動權在業務層,而現在主動權在使用者手中。如下圖

IOC控制反轉思想IOC控制反轉
IOC控制反轉思想IOC控制反轉

很明顯,通過set注入能将程式的主動權交給使用者而非程式員,也就是說程式員不用去管理對象的建立,而是更專注于業務層的功能實作,進而減少了系統的耦合性。

IOC控制反轉總結

控制反轉是一種通過描述(xml配置或注解)并通過第三方去生成或擷取特點對象的一種方式,在Spring中實作控制反轉的是IOC容器,實作方法是依賴注入

控制:即控制對象的建立

反轉:程式本身不自己主動建立對象,而是被動的接收對象。

繼續閱讀