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代碼),主動權在業務層,而現在主動權在使用者手中。如下圖
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNCM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0zZU9UN4YEZ55kMMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL1YzM2EzNycTMzIzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
很明顯,通過set注入能将程式的主動權交給使用者而非程式員,也就是說程式員不用去管理對象的建立,而是更專注于業務層的功能實作,進而減少了系統的耦合性。
IOC控制反轉總結
控制反轉是一種通過描述(xml配置或注解)并通過第三方去生成或擷取特點對象的一種方式,在Spring中實作控制反轉的是IOC容器,實作方法是依賴注入
控制:即控制對象的建立
反轉:程式本身不自己主動建立對象,而是被動的接收對象。