传统的设计
UserDao接口
public interface UserDao {
public void getUser();
}
UserDaoImpl实现类
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("获取用户数据");
}
}
UserService接口
public interface UserService {
void getUser();
}
UserServiceImpl实现类
public class UserServiceImpl implements UserService{
private UserDao userDao=new UserDaoImpl();
@Override
public void getUser() {
userDao.getUser();
}
}
测试代码
@Test
public void test1(){
UserServiceImpl userService=new UserServiceImpl();
userService.getUser();
}
现在是在UserServiceImpl实现类中new一个UserDaoImpl,再通过调用UserDaoImpl的getUser方法
新增需求:增加一个UserDao的实现类UserMySQLImpl,
UserMySQLImpl实现类:
public class UserMySQLImpl implements UserDao{
@Override
public void getUser() {
System.out.println("获取用户的MySQL数据");
}
}
UserServiceImpl实现类
public class UserServiceImpl implements UserService{
private UserDao userDao=new UserDaoImpl();
private UserDao userDao1=new UserMySQLImpl();
@Override
public void getUser() {
userDao.getUser();
userDao1.getUser();
}
}
UserServiceImpl类中新增了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V77fh1ay-1619192261356)(https://i.loli.net/2021/04/23/3GhfZvFSA7LPXQB.png)]
要是现在再增加一个UserDao的实现类,则需要在UserServiceImpl中new一个UserDao的实现类,以此类推,要是有很多不同的UserDao实现类,则需要不停地往UserServiceImpl中新增new语句,不断修改其中的代码。需求多了以后,每次修改显得非常麻烦。
解决方法:
修改UserServiceImpl类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kT8PIsjW-1619192261358)(https://i.loli.net/2021/04/23/cj1sVLlqhJfuTMg.png)]
用户每次调用只需要new 一个想要调用的类即可,而不是每次都需要程序员去修改UserServiceImpl中的代码
调用UserDaoImpl
调用UserMySQLImpl
在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们要根据用户的需求去修改代码,如果代码量大,修改一次的成本非常高。
现在我们使用一个set注入接口,已经发生了革命性变化
-
之前,程序主动创建对象,控制权在程序员手上
-
使用set注入接口后,程序不再具有主动性,而是变成了被动的接受对象
这就叫控制反转
-
这种思想,从本质上解决了问题,程序员不再用去管理对象的创建,系统耦合性大大降低,这是IOC的原型