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

JAVA-Spring中IOC容器是什么?

目录

  • JAVA-Spring中IOC容器是什么?
    • 什么是IOC?
    • 什么是IOC容器?
    • IOC和IOC容器的对比
    • Spring框架中的IOC容器是如何工作的?
    • 使用XML配置的ApplicationContext
    • 使用注解的AnnotationConfigApplicationContext
    • 总结

JAVA-Spring中IOC容器是什么?

什么是IOC?

    IOC(Inversion of Control,控制反转)是一种设计原则,它将对象的创建和对象之间的依赖关系的管理从应用程序代码中分离出来。在传统的编程模式中,应用程序代码通常负责创建和管理对象,这导致了代码的紧耦合和可维护性的降低。而通过IOC,对象的创建和依赖关系的管理由容器来负责,应用程序代码只需要通过容器来获取所需的对象。

什么是IOC容器?

    在JAVA-Spring中,IOC容器是用来管理对象的容器。它负责创建对象,并管理对象之间的依赖关系。在IOC容器中,对象的创建和依赖关系的管理是通过配置文件或注解来实现的。

    Spring提供了多种IOC容器的实现,其中最常用的是基于XML配置的ApplicationContext和基于注解的AnnotationConfigApplicationContext。

IOC和IOC容器的对比

在这里插入图片描述

Spring框架中的IOC容器是如何工作的?

    在Spring框架中,IOC容器的工作原理可以简单概括为以下几个步骤:

    配置加载:在应用程序启动时,IOC容器会读取配置文件(如XML文件或者基于注解的配置类),获取对象的定义和依赖关系。

    对象创建:根据配置文件中的定义,IOC容器会实例化所需的对象,并将它们存储在容器中的一个对象池中。

    依赖注入:IOC容器会检查对象之间的依赖关系,并将依赖的对象注入到相应的对象中。这可以通过构造函数注入、属性注入或者方法注入来实现。

    对象生命周期管理:IOC容器负责管理对象的生命周期。它会在需要时创建对象,并在不再需要时销毁对象。对于单例对象,IOC容器会将其缓存起来,以供后续使用。

    对象访问:通过IOC容器,开发人员可以方便地获取所需的对象。可以通过名称或者类型来获取对象,容器会根据配置信息进行匹配。

    容器管理:IOC容器还提供了一些管理功能,如对象的作用域管理、AOP(面向切面编程)支持、事件机制等。开发人员可以通过配置文件或者编程方式来使用这些功能。

使用XML配置的ApplicationContext

    首先,我们需要创建一个XML配置文件来描述对象的创建和依赖关系。下面是一个简单的示例:

<beans><bean id="userService" class="com.example.UserService"><property name="userRepository" ref="userRepository" /></bean><bean id="userRepository" class="com.example.UserRepositoryImpl" />
</beans>

    在上面的配置文件中,我们定义了一个名为userService的bean,它的类型是com.example.UserServiceuserService依赖于另一个名为userRepository的bean,它的类型是com.example.UserRepositoryImpl。通过<property>标签,我们将userRepository注入到了userService中。

    接下来,我们需要在应用程序代码中获取userService对象。可以通过下面的代码来实现:

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = context.getBean("userService", UserService.class);

    在上面的代码中,我们使用ClassPathXmlApplicationContext类来创建一个ApplicationContext对象,并指定XML配置文件的路径。然后,通过getBean()方法来获取userService对象。

使用注解的AnnotationConfigApplicationContext

    除了XML配置外,Spring还支持使用注解来配置IOC容器。使用注解配置的IOC容器更加简洁和方便。下面是一个使用注解的示例:

@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserService(userRepository());}@Beanpublic UserRepository userRepository() {return new UserRepositoryImpl();}
}

    在上面的示例中,我们使用@Configuration注解来标记一个配置类。通过@Bean注解,我们可以定义一个bean,并指定其创建和依赖关系。在userService()方法中,我们创建了一个UserService对象,并注入了userRepository()方法返回的对象。

    接下来,我们需要在应用程序代码中获取userService对象。可以通过下面的代码来实现:

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean(UserService.class);

    在上面的代码中,我们使用AnnotationConfigApplicationContext类来创建一个ApplicationContext对象,并指定配置类的类型。然后,通过getBean()方法来获取userService对象。

总结

    在JAVA-Spring中,IOC容器是用来管理对象的容器。它负责创建对象,并管理对象之间的依赖关系。通过IOC容器,我们可以实现对象的解耦和依赖关系的灵活管理。在Spring中,我们可以使用XML配置或注解来配置IOC容器,并通过容器来获取所需的对象。

    以上是关于JAVA-Spring中IOC容器的简单介绍和示例代码。希望对你理解IOC容器有所帮助!

相关文章:

JAVA-Spring中IOC容器是什么?

目录 JAVA-Spring中IOC容器是什么&#xff1f;什么是IOC&#xff1f;什么是IOC容器&#xff1f;IOC和IOC容器的对比Spring框架中的IOC容器是如何工作的&#xff1f;使用XML配置的ApplicationContext使用注解的AnnotationConfigApplicationContext总结 JAVA-Spring中IOC容器是什…...

QT多屏显示程序

多屏显示的原理其实很好理解&#xff0c;就拿横向扩展来说&#xff1a; 计算机把桌面的 宽度扩展成了 w1&#xff08;屏幕1的宽度&#xff09; w2(屏幕2的宽度) 。 当一个窗口的起始横坐标 > w1&#xff0c;则 他就被显示在第二个屏幕上了。 多屏虚拟成一个桌面&#xff0…...

python使用xlwt时,报ValueError: More than 4094 XFs (styles)

在写表格时&#xff0c;遇到如下报错 一、报错原因 xlwt最多只能有4094个样式&#xff0c;超出这个样式数量就报错了。 二、解决办法 &#xff08;1&#xff09;去掉样式的要求...

GitHub 打不开解决方案

GitHub 这几年国内普通用户越来越难以访问&#xff0c;github 作为全球最大的开源平台&#xff0c;里面有用的内容很多&#xff0c;不管是对专业用户还是普通用户&#xff0c;无法访问都是很严重的问题。 1.GitHub 加速镜像 kgithub 是一个公益加速项目&#xff0c;仅需在 gi…...

Java网络编程(一)网络基础

概述 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递 网络分类 局域网(LAN) 局域网是一种在小区域内使用的,由多台计算机组成的网络,覆盖范围…...

matlab使用教程(17)—多项式的定义和运算

1.创建并计算多项式 此示例说明如何在 MATLAB 中将多项式表示为向量以及根据相关点计算多项式。 1.1 表示多项式 MATLAB 将多项式表示为行向量&#xff0c;其中包含按降幂排序的系数。例如&#xff0c;三元素向量 p [p2 p1 p0]; 表示多项式 创建一个向量以表示二次多项式…...

华为认证 | 这门HCIA认证正式发布!

华为认证云服务工程师HCIA-Cloud Service V3.5&#xff08;中文版&#xff09;自2023年8月11日起&#xff0c;正式在中国区发布。 01 发布概述 基于“平台生态”战略&#xff0c;围绕“云-管-端”协同的新ICT技术架构&#xff0c;华为公司打造了覆盖ICT领域的认证体系&#xf…...

【Docker】Docker安装 MySQL 8.0,简洁版-快速安装使用

今天&#xff0c;使用docker安装mysql数据库进行一个测试&#xff0c;结果网上找了一篇文章&#xff0c;然后。。。。坑死我… 特总结本篇安装教程&#xff0c;主打一个废话不多说&#xff01; 坑&#xff1a;安装成功&#xff0c;客户端工具连接不上数据库》。。。 正文&…...

CSS自己实现一个步骤条

前言 步骤条是一种用于引导用户按照特定流程完成任务的导航条&#xff0c;在各种分步表单交互场景中广泛应用。例如&#xff1a;在HIS系统-门诊医生站中的接诊场景中&#xff0c;我们就可以使用步骤条来实现。她的执行步骤分别是&#xff1a;门诊病历>遗嘱录入>完成接诊…...

Visual Studio 2019 解决scanf函数报错问题

前言 Visual Studio 2019 解决scanf函数报错问题 博主博客链接&#xff1a;https://blog.csdn.net/m0_74014525 关注博主&#xff0c;后期持续更新系列文章 *****感谢观看&#xff0c;希望对你有所帮助***** 系列文章 第一篇&#xff1a;Visual Studio 2019 详细安装教程&…...

亚马逊无限买家号如何注册?

如果想要拥有大批量的亚马逊买家号&#xff0c;可以使用亚马逊鲲鹏系统进行自动注册操作。在注册之前我们需要先准备好账号所需要的资料&#xff1b; 1、Ip&#xff1a;软件系统支持11个亚马逊站点使用&#xff0c;因此注册哪一个国家的买家号时就需要购买相应国家的ip&#x…...

前端框架学习-ES6新特性(尚硅谷web笔记)

ECMASript是由 Ecma 国际通过 ECMA-262 标准化的脚本程序设计语言。javaScript也是该规范的一种实现。 新特性目录 笔记出处&#xff1a;b站ES6let 关键字const关键字变量的解构赋值模板字符串简化对象写法箭头函数rest参数spread扩展运算符Promise模块化 ES8async 和 await E…...

普陀发布新规服务元宇宙企业 和数软件发展元宇宙场景落地

近日&#xff0c;数智中国AIGC科技周2023全球元宇宙大会上海站活动现场“半马苏河”元宇宙企业科创政策包正式发布。政策包在普陀原有科创政策基础上进行了叠加升级&#xff0c;一共涵盖了十条专项服务元宇宙企业的专项政策&#xff0c;简称普陀“元十条”。 普陀“元十条”从…...

Kotlin差异化分析,let,run,with,apply及also

作用域函数是Kotlin比较重要的一个特性&#xff0c;共分为以下5种&#xff1a;let、run、with、apply 以及 also&#xff0c;这五个函数的工作方式可以说非常相似&#xff0c;但是我们需要了解的是这5种函数的差异&#xff0c;以便在不同的场景更好的利用它。 读完这篇文章您将…...

(stm32)低功耗模式

低功耗模式 执行哪个低功耗模式的程序判断流程 标志位设置操作一定要在WFI/WFE之前&#xff0c;调用此指令后立即进入睡眠判断流程 模式对比 睡眠模式 停止模式 待机模式...

【C++学习手札】一文带你认识C++虚函数(内层剖析)

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f340;本文前置知识&#xff1a; C初识继承 ♈️今日夜电波&#xff1a;No title —REOL 1:02 ━━━━━━️&#x1f49f;──────── 4:03 …...

Python“牵手”1688商品评论数据采集方法,1688API申请指南

1688平台API接口是为开发电商类应用程序而设计的一套完整的、跨浏览器、跨平台的接口规范&#xff0c;1688API接口是指通过编程的方式&#xff0c;让开发者能够通过HTTP协议直接访问1688平台的数据&#xff0c;包括商品信息、店铺信息、物流信息等&#xff0c;从而实现1688平台…...

“深入解析JVM内部机制:探秘Java虚拟机的奥秘“

标题&#xff1a;深入解析JVM内部机制&#xff1a;探秘Java虚拟机的奥秘 摘要&#xff1a;本文将深入解析JVM&#xff08;Java虚拟机&#xff09;的内部机制&#xff0c;从字节码执行到垃圾回收&#xff0c;逐步揭示Java程序运行的奥秘。通过理论分析和示例代码&#xff0c;读…...

【系统工具】开源服务器监控工具WGCLOUD初体验

经常看到服务器上传下载流量一直在跑&#xff0c;也不知道是啥软件在偷偷联网~~~官网地址&#xff1a;www.wgstart.com&#xff0c;个人使用是免费的。 WGCLOUD官网介绍 "WGCLOUD支持主机各种指标监测&#xff08;cpu使用率&#xff0c;cpu温度&#xff0c;内存使用率&am…...

powerBI应用技巧

power BI应用技巧 持续跟新 1.函数日期表 使用高级编辑器—M函数&#xff08;把下面代码直接复制即可&#xff09; 版本1&#xff1a;前单位写的M函数&#xff0c;日期是2021年开始的 letdate(optional 请输入开始年份 as number,optional 请输入结束年份 as number)>l…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...

c# 局部函数 定义、功能与示例

C# 局部函数&#xff1a;定义、功能与示例 1. 定义与功能 局部函数&#xff08;Local Function&#xff09;是嵌套在另一个方法内部的私有方法&#xff0c;仅在包含它的方法内可见。 • 作用&#xff1a;封装仅用于当前方法的逻辑&#xff0c;避免污染类作用域&#xff0c;提升…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...