IoC: Inversion of Control (控制反转/反转控制)
环境搭建
UserDao和UserDaoImpl
public interface UserDao {
void getUser();
}
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("默认获取用户数据");
}
}
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("mysql获取用户数据");
}
}
public class UserDaoOracleImpl implements UserDao{
@Override
public void getUser() {
System.out.println("Oracle获取用户数据");
}
}
UserService和UserServiceImpl
public interface UserService {
void getUser();
}
public class UserServiceImpl implements UserService{
private UserDao userDao = new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试
public static void main(String[] args) {
//用户实际调用的是业务层,不需要结束dao层
UserService service = new UserServiceImpl();
service.getUser();
}
这样操作的话会有个问题,如果顾客需求改变了,那么需要我们去修改内部的代码,如果代码量大的话,修改起来会非常麻烦,所以我们需要把控制权交给我们的顾客去操作或者降低我们的修改难度。
我们可以在UserServiceImpl中加入一个set方法,使得可以让用户去修改他想要的
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
测试
public static void main(String[] args) {
//用户实际调用的是业务层,不需要结束dao层
UserService service = new UserServiceImpl();
((UserServiceImpl) service).setUserDao(new UserDaoMysqlImpl());
service.getUser();
这样的话就可以把控制权交给用户自己了,这就是IoC原型。