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();
}
}