当前位置: 首页 > news >正文

IOC推导和本质

IOC理论推导:

1、先写一个UserDao接口

public interface UserDao {public void getUser();
}

2、再去写UserDaolmpl的实现类

public class UserDaoImpl implements UserDaolmpl{@Overridepublic void getUser() {System.out.println("获取用户数据");}
}

3、然后去写UserService的接口

public interface UserService {public void getUser();
}

4、最后写UserServicelmpl的实现类

public class UserServiceImpl implements UserService {private UserDao userDao = new UserDaoImpl();@Overridepublic void getUser() {userDao.getUser();}
}

5、测试一下

@Test
public void test(){UserService service = new UserServiceImpl();service.getUser();
}

6.把Userdao的实现类增加一个 .

public class UserDaoMySqlImpl implements UserDao {@Overridepublic void getUser() {System.out.println("MySql获取用户数据");}
}

紧接着我们要去使用MySql的话 , 我们就需要去service实现类里面修改对应的实现

public class UserServiceImpl implements UserService {private UserDao userDao = new UserDaoMySqlImpl();@Overridepublic void getUser() {userDao.getUser();}
}

7.在假设, 我们再增加一个Userdao的实现类 

public class UserDaoOracleImpl implements UserDao {@Overridepublic void getUser() {System.out.println("Oracle获取用户数据");}
}

那么我们要使用Oracle , 又需要去service实现类里面修改对应的实现 . 假设我们的这种需求非常大 , 这种方式就根本不适用了

我们使用set接口实现。

//原来的
public class UserServiceImpl implements UserService {
//写死了 每增加一个类实现必须修改这  private UserDao userDao = new UserDaoImpl();@Overridepublic void getUser() {userDao.getUser();}
}//修改后的
public class UserServiceImpl implements UserService {private UserDao userDao;
// 利用set进行动态实现值的注入public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void getUser() {userDao.getUser();}
}

 现在去我们的测试类里 , 进行测试 

@Test
public void test(){UserServiceImpl service = new UserServiceImpl();service.setUserDao( new UserDaoMySqlImpl() );service.getUser();//那我们现在又想用Oracle去实现呢service.setUserDao( new UserDaoOracleImpl() );service.getUser();
}

IOC本质:

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法。没有IoC的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制控制反转后将对象的创建转移给第三方。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL聚簇索引和非聚簇索引的区别
  • 最新AI系统ChatGPT网站H5系统源码,支持AI绘画,GPT语音对话+ChatFile文档对话总结+DALL-E3文生图
  • Vue3-31-路由-RouterView的name属性的作用
  • 【STM32】TIM1在电机应用时的注意事项
  • CGAL的三角曲面网格变形
  • 创建加密分区或者文件
  • 前端 -- 基础 常用标签 ( 图像标签及其属性详解)
  • postman使用-03发送请求
  • 很实用的ChatGPT网站——httpchat-zh.com
  • 树莓派 ubuntu20.04下 python调讯飞的语音API,语音识别和语音合成
  • UIToolKit使用心得
  • 挑战Python100题(7)
  • 微软发布补丁,修复 Win10、Win11 关键漏洞
  • SQL使用从入门到优化:目录
  • c++_运算符重载(时钟加减)
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • bootstrap创建登录注册页面
  • css的样式优先级
  • CSS居中完全指南——构建CSS居中决策树
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • docker容器内的网络抓包
  • Invalidate和postInvalidate的区别
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • js算法-归并排序(merge_sort)
  • magento2项目上线注意事项
  • MYSQL如何对数据进行自动化升级--以如果某数据表存在并且某字段不存在时则执行更新操作为例...
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • 初识MongoDB分片
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 在Mac OS X上安装 Ruby运行环境
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​如何防止网络攻击?
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • (NSDate) 时间 (time )比较
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (十五)使用Nexus创建Maven私服
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (一一四)第九章编程练习
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • [12] 使用 CUDA 进行图像处理
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • [acm算法学习] 后缀数组SA
  • [BZOJ2281][SDOI2011]黑白棋(K-Nim博弈)
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C/C++]_[初级]_[关于编译时出现有符号-无符号不匹配的警告-sizeof使用注意事项]
  • [hdu 1711] Number Sequence [kmp]
  • [Java] 模拟Jdk 以及 CGLib 代理原理
  • [leetcode hot 150]第一百三十七题,只出现一次的数字Ⅱ