IOC 理论推导与本质
开发工具与关键技术:IDEA JAVA
作者:萧氏萧然
撰写时间:2021年8月5日
首先创建环境模拟项目查询调用数据库数据
Dao层:
构建一个接口:
public interface UserDao {
void getUser();
}
现在用户需求使用的是MySql数据库
实现:
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("Mysql获取数据");
}
}
Service层:
构建一个接口:
public interface UserService {
void getUser();
}
实现类:
public class UserServiceImpl implements
UserService{
//业务层 调dao去查
private UserDao userDao = new UserDaoMysqlImpl();
}
用户层:
public class Mytest {
public static void main(String[] args) {
//用户实际调用的是业务层,dao层他们不需要接触
UserDaoMysqlImpl Mysql = new UserDaoMysqlImpl();
Mysql.getUser();
}
}
那么如果现在用户需求改变换一个数据库使用
我们是不是需要再去写一个实现然后把Service层实现类new出来的实例改成更改后的
增加了类改了原来的代码
//用户需求变动 更改大量源代码
//private UserDao userDao = new UserDaoImpl();
//private UserDao userDao = new UserDaoMysqlImpl();
//private UserDao userDao = new UserDaoOrcaleImpl();
每一次因为用户的需求而去大量改动代码
这还只是一个类块改变,如果是大量的改变,那十几二十个全部都得改
能不能解决这个问题?
每增加一个类,程序不动,让客户端去自己调用
接口
Set
修改Service实现获取dao数据方式 使用set注入 用户层直接调用想要的
public class UserServiceImpl implements
UserService{
//业务层 调dao去查
//用户需求变动 更改大量源代码
//private UserDao userDao = new UserDaoImpl();
//private UserDao userDao = new UserDaoMysqlImpl();
//private UserDao userDao = new UserDaoOrcaleImpl();
//之前,程序是主动创建对象!控制权在程序员手上!
//使用了set注入后,程序不再有主动性,而是变成了被动的接受对象!
//控制反转
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层他们不需要接触
// UserDaoMysqlImpl Mysql = new UserDaoMysqlImpl();
// Mysql.getUser();
//接口 实现类
UserService userService = new UserServiceImpl();
//用户控制想要的
((UserServiceImpl) userService).setUserDao(new UserDaoOrcaleImpl());
userService.getUser();
((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
userService.getUser();
((UserServiceImpl) userService).setUserDao(new UserDaoImpl());
userService.getUser();
// //直接找新建的实现
((UserServiceImpl) userService).setUserDao(new UserDaoSqlserverImpl());
userService.getUser();
}
}
这种思想,从本质上解决的问题,我们不用再去管理对象的创建了,系统的耦合性大大降低,可以更加专
注于的在业务的实现上
IOC原型
源码链接:https://pan.baidu.com/s/1CInPo0bWWI97DqCXej5Xfg
提取码:root