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