轻松理解Java面试和开发中的IoC(控制反转)

发布时间 - 2026-01-11 02:16:15    点击率:

IoC的概念介绍

控制反转(IOC)模式(又称DI:Dependency Injection)就是Inversion of Control,控制反转。在Java开发中,IoC意 味着将你设计好的类交给系统去控制,而不是在你的类内部控制。这称为控制反转。

控制反转(Inversion of Control,英文缩写为IoC)是框架的重要特征,做到控制反转需要一个容器来实现,就是我们所说的IoC容器,最常见的IoC容器是Spring。

控制反转从字面意思看来不是很好理解,其实就是将创建管理对象的工作交给容器来做。在以前的编程中,创建一个对象需要显式的new出来,但是控制反转是在容器初始化(或者某个指定时间节点)时通过反射机制(上一篇文章有介绍)创建好对象,在使用时去容器中获取。将对象的控制权反过来交给容器管理,所以称之为“控制反转”。

一、IoC容器是怎么实现的呢?

IoC容器的底层实现其实是工厂模式,通过工厂模式和反射机制,根据XML中给出的类名生成相应的对象。其实IoC容器的实现很简单,就是一个HashMap,接下来,我们实现一个简单的IoC容器:

1.读取配置文件,并初始化容器

配置文件可以是XML或者properties文件,下面代码是读取两种配置文件创建实例,并放到容器中(容器的实现是HashMap):

(1)读取xml配置文件,创建实例放进容器的实现:

读取XML创建容器

(2)读取properties文件,创建实例放进容器的实现:

读取properties创建容器

2.ApplicationContextFactory工厂的实现(调用初始化容器的方法)

通过工厂创建应用上下文中配置的对象,在此工厂中判断是否存在XML或prop文件,并初始化容器:

ApplicationContextFactory工厂的实现

3.容器的使用

通过工厂创建完容器就可以使用了,调用getBean(String beanId)方法获取容器中的对象实例:

容器的使用

二、依赖注入(DI,Dependency Injection)和依赖查找(Dependency Lookup)是什么?

依赖注入和依赖查找是IoC的两种主要实现方式,我直接把依赖查找给扔了没去理解他,一般会把IoC和DI放在一起说。

其实可以把DI和IoC理解为同一件事,都是把创建实例的控制权交给容器来操作,只是两种叫法的角度不同:

控制反转是从代码操作对象的角度来看,将操作对象的控制权反转交给了容器;

依赖注入是从容器的角度看,我把你需要的对象或属性注入到你代码中去。


# java面试  # 控制反转  # ioc  # Java基础之Spring5的核心之一IOC容器  # Java开发到底为什么要用 IoC 和 AOP  # 使用Java注解模拟spring ioc容器过程解析  # 基于Java反射技术实现简单IOC容器  # 深入理解java的spring-ioc的使用  # Java使用IOC控制反转的三种设计模式详解  # 用java的spring实现一个简单的IOC容器示例代码  # Spring学习笔记1之IOC详解尽量使用注解以及java代码  # 详解JavaSE实现IoC  # 两种  # 配置文件  # 是在  # 是从  # 都是  # 很好  # 在此  # 是怎么  # 把你  # 而不  # 上一  # 给了  # 很简单  # 到你  # 一件事  # 会把  # 来做  # 中去  # 将你  # 来实现 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何登录建站主机?访问步骤全解析  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  网站制作价目表怎么做,珍爱网婚介费用多少?  如何获取上海专业网站定制建站电话?  音乐网站服务器如何优化API响应速度?  如何在IIS中配置站点IP、端口及主机头?  Laravel如何实现模型的全局作用域?(Global Scope示例)  三星、SK海力士获美批准:可向中国出口芯片制造设备  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何做网站制作流程,*游戏网站怎么搭建?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  如何在万网主机上快速搭建网站?  Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转  微信小程序 canvas开发实例及注意事项  如何打造高效商业网站?建站目的决定转化率  Laravel如何使用Blade组件和插槽?(Component代码示例)  网站图片在线制作软件,怎么在图片上做链接?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel如何处理异常和错误?(Handler示例)  如何在IIS7上新建站点并设置安全权限?  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  用v-html解决Vue.js渲染中html标签不被解析的问题  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?  如何破解联通资金短缺导致的基站建设难题?  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】  Bootstrap CSS布局之列表  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  香港服务器如何优化才能显著提升网站加载速度?  php485函数参数是什么意思_php485各参数详细说明【介绍】  微信小程序 scroll-view组件实现列表页实例代码  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  公司门户网站制作流程,华为官网怎么做?  微信小程序 require机制详解及实例代码  jQuery validate插件功能与用法详解  浅谈javascript alert和confirm的美化  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  Windows Hello人脸识别突然无法使用  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  Swift中swift中的switch 语句