【Spring】详细理解Spring中控制反转(IOC)和依赖注入(DI)的设计思想。

news2025/1/4 18:56:20

目录

1.相关概念

2. 设计IOC容器的两个主要接口

2.1 BeanFactory接口

2.2 ApplicationContext接口

2.3 两个接口的区别【面试题】

3. Bean对象的管理(控制反转)

3.1 基于XML文件管理bean对象

3.2 基于注解方式去管理【重点】

4. 依赖注入(DI)

4.1 setter 方法和构造器注入

4.2 通过注解的方式注入

4.3 set注入和构造器注入的区别

@Resource注解@Autowired注解区别【面试题】


1.相关概念

  • 控制反转(IOC):对象的创建权由程序员自身转移到外部容器,这种思想叫做控制反转。
  • 依赖注入(DI):容器为应用程序提供运行时所依赖的资源,好做依赖注入。
  • Bean对象:IOC容器中创建,管理的对象,称为bean对象。
  • 通俗的理解就是:将对象放入容器的思想叫做控制反转;容器为运用程序提供需要的数据这叫做依赖注入;ICO容器中的对象被称为Bean对象。

一张图理解全过程

2. 设计IOC容器的两个主要接口

Spring IoC容器的设计主要是基于BeanFactory和ApplicationContext两个接口实现的。

2.1 BeanFactory接口

BeanFactory是IOC容器的核心接口,他的主要职 责:实例化、定位、配置应用程序中的对象及建立这些对象之间的依赖。

public class BeanFactoryTest {
    
   public static void main(String[] args) {
       //初始化Spring容器,加载配置文件
       BeanFactory beanFac = 
               new XmlBeanFactory(new FileSystemResource("D:\\softwaretool 
                             \\eclipseworkspace\\SpringExample\\src\\main
                                        \\resources\\applicationContext.xml"));

      //通过容器获取test实例
       Student tt = (Student)beanFac.getBean("stu");
       System.out.println(tt.getName());;
   }
}

上面的代码中,通过BeanFactory的实现类XmlBeanFactory()读取配置文件,然后创建xml中的bean对象,后面通过相应的方法得到该对象并输出。

2.2 ApplicationContext接口

ApplicationContext 是IOC容器的非常重要的一个接口, 它继承了BeanFactory接口的基本功能,同时也继承了容器的高级功能如MessageSouce(国际化 资源接口)、ResourcesLoader(资源加载接口)、ApplicationEventPublisher(应用事件发布 接口)等,在实际的开发应用中我们必然会选择功能强大的ApplicationContext 接口获取资源 信息!

该接口的三个实现类如下

  • ClassPathXmlApplicationContext   从类的路径中加载IOC容器配置
  • FileSystemXmlApplicationContext   从文件路径加载IOC容器
  • XmlWebApplicationContext   从web系统的xml文件中读取配置并加载IOC容器

2.3 两个接口的区别【面试题】

  •  加载方式: BeanFactory在启动的时候不会去实例化bean,只有从容器中拿bean的时候才去实例化,应用启动的 时候占用的资源比较少。 ApplicationContext 在启动的时候就把所有的bean默认全部实例化,占用资源,但是可以通过 lazy-init=true来配置bean的延迟加载。
  • BeanFactory方法比较旧,初始化容器的时候需要绝对路径查找文件。而ApplicationContext 本身提供3种方式,相对、绝对、web.xml

3. Bean对象的管理(控制反转)

        我们希望IOC容器能够帮助我们管理业务bean对象,所以我们必须告诉IOC(配置)容器去管理哪些类,其中有两种方式 。

  1. 基于XML文件格式 指将bean信息直接配置到Spring核心配置XML中
  2. 基于注解方式去管理

3.1 基于XML文件管理bean对象

下图所示为xml对bean对象的管理(注入方法,下面介绍)

3.2 基于注解方式去管理【重点】

注解介绍

  • @Component 标识一个受Spring管理的基本组件(加载到IOC容器中管理)
  • @Repository标识持久层组件类
  • @Service 标识业务层组件类
  • @Controller 标识控制层组件类

注:@Repository,@Service,@Controller这三个注解包含了@Component,只是为了区分不同的业务层,相当于起了个别名。

如上图所示,使用上面这个注解后,对象自动交给IOC容器管理,及其简单。

4. 依赖注入(DI)

        所谓的注入,就是将容器中的值或对象注入给所需的类,Spring提供3种常用方式去注入值,并且可以 注入若干的数据类型,接下来我们学习以下。

  • setter 方法注入
  • 构造器注入
  • 注解的方式注入

4.1 setter 方法和构造器注入

就是在需要用到某个bean对象时,提供该对象的 set 方法,通过该方法将对象传递给使用者。

举例说明:通过注解的方式,将IOC容器中的对象提供给使用者。

1. spring配置文件如下,管理了三个bean对象,分别是demoController,demoController,demoDao

 

2. 下面demoController类的代码如下,需要的demoService的数据是IOC容器通过set方法注入的。

3.下面demoService类的代码如下,需要的demoDao的数据是IOC容器通过构造器的方式注入的。

demoDao代码如下 

执行测试代码

测试结果,说明bean注入成功!

4.2 通过注解的方式注入

有两个注解可以实现注入

@Resource 自动装配(java提供的)

@Autowired 自动装配(spring提供的)

如下图所示的三个类,通过@AutoWired注解将需要的数据自动注入了。如果将该注解换成@Resource,结果是一样的但是这两个注解也有相应的区别。

测试方法如下:

输出结果如下,拿到dao层结果,说明注入成功!

4.3 set注入和构造器注入的区别

setter 注入

  • setter 注入需要该Bean包含这些属性的setter方法 与传统的JavaBean的写法更相似,程序开发人员更容易理解、接收。
  •  对于复杂的依赖关系,如果采用构造注入,会导致构造器臃肿,难以阅读。Spring在创建Bean实例时,还需要同时实例化依赖的全部实例,会导致性能下降。而使用set注入,则能避免这些问题 。

构造器注入

  • 构造注入需要该Bean包含带有这些属性的构造器
  • 构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。
  • 对于依赖关系无需变化的Bean,构造注入更有用处。,所有的依赖关系全部 在构造器内设定。因此,无需担心后续的代码对依赖关系产生破坏。对组件的调用者而 言,组件内部的依赖关系完全透明,更符合高内聚的原则。

 

@Resource注解@Autowired注解区别【面试题】

  • @Autowired 自动装配可以对成员变量、方法、和构造函数进行标注,来完成自动装配工作, @Autowired会根据类型(byType)进行自动装配 ,使用的时候先去容器中查询注解的类型的bean,如果查询结果为一个,就将该bean装配给 @Autowired指定的数据,如果结果不止一个@Autowired会根据名称匹配(byName),如果查询结果 为空则抛出异常。
  • @Resource自动装配首选声明这个注解并不是Spring注解,它是javaEE注解,但Spring默认支持这个注解,@Resource有两个主要的属性, name和type,如果注解时使用name属性,则使用 ByName注入策略,使用type属性时则使用byType自动注入策略,如果都不指定,则通过反射机制默认使用byName注入策略。
  • 【简单说】两个都能完成自动装配工 作,@Autowired默认按照byType方式进行bean装配,@Resource默认按照byName方式进行bean装 配,@Resource不是Spring注解,@Resource是JAVAEE注解。

说明:当出现有两个相同的Bean实例时,这种情况一般是一个接口的多个实现类,这时候如果不指定使用哪个实现类就会报错。 

下面举例说明,这两个注解遇到这种情况的解决方法。

注:JDK17中java不自带了@Resource注解,需要导入相关依赖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1969533.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

81.WEB渗透测试-信息收集-框架组件识别利用(5)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于: 易锦网校会员专享课 上一个内容:80.WEB渗透测试-信息收集-框架组件识别利用(4) solr:…

第三方库jsoncpp

文章目录 0.jsoncpp库是做什么的?1.安装库2.有哪几个类,如何使用Json::Value类Json::Writer类-StreamWriterJson::Reader类-CharReader三者关系 3.使用样例将数据先存入Value类,再通过StreamWriter类转为Json格式的字符串获取到Json格式字符串…

6 postgresql事务与并发控制

事务与并发控制 事务可以理解为做一件事,数据库就是一件事要么做完,要么不做,不然这数据库给给人不可靠的感觉 正如解释事务具有四个重要特性:ACID(原子性,一致性,隔离性,持久性&a…

python实现提取视频帧的图片

文章目录 1、需求痛点2、完整代码⭐3、代码分析3.1、需要改动的地方3.2、OpenCV库的使用3.3、多线程技术 4、执行效率5、效果展示⭐6、注意事项🔺7、总结 🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注…

3 IIC总线

3 IIC总线 1、基本概念1.1 IIC总线定义1.2 IIC总线协议概念 2 以AT24C02为例说明时序2.1 基本特性2.2 利用GPIO模拟IIC2.3 对AT24C02的操作2.4 重定向printf 1、基本概念 1.1 IIC总线定义 定义:两线式串行总线 两线式:说明处理器和外设之间只需两根信号…

【时间复杂度和空间复杂度】(内含超多实例练习)

【时间复杂度和空间复杂度】(内含超多实例练习) 1. 算法效率2. 时间复杂度2.1 时间复杂度的概念2.2 实例练习2.2.1 数组中搜索数据2.2.2 冒泡排序2.2.3 二分查找2.2.4 阶乘递归2.2.5 斐波那契递归 3. 空间复杂度3.1 空间复杂度的概念3.2 实例练习3.2.1 冒…

Set Hashset底层原理 LinkedSet底层原理 Treeset 31

不重复只执行一次,排序是小到大,色图是接口类 Hashset底层原理 LinkedSet底层原理 Treeset 总结

AI+云边端协同,EasyCVR视频汇聚技术赋能安防监控新生态

随着信息技术的飞速发展和数字化时代的到来,安防监控领域的技术也在不断创新和突破。EasyCVR平台的视频汇聚技术作为其中的佼佼者,以其强大的视频处理、汇聚与融合能力,在安防监控领域展现出了巨大的应用潜力和价值。本文将详细介绍EasyCVR视…

权限束缚术:windows工具自动化权限提升

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理利用工具全自动化提权的相关操作方法 因为我没有相关的环境复现,所以没有成功 不过复现的操作就是下面整理的操作 溢出漏洞提权原理 利用溢出漏洞提权,实际上就是一次判断过往的…

极简聊天室-websocket版

再写一个极简聊天室的websocket版,在本例中,websocket仅用于服务器向客户端传输信息,客户端向服务器发送信息是传统的http post方式,用axios来实现的,当然websocket本身是支持双向通信,主要是为了方便跟前面…

Selenium 无法定位元素的几种解决方案

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位。 解决方法: d…

LLM大模型实战项目--基于ChatGLM2的小书虫文档阅读助手

本文介绍如此从零开始编写一个基于ChatGLM2的文档阅读助手 一、项目介绍 二、获取API接口 三、环境配置 四、代码实现 五、效果展示 一、项目介绍 小书虫📚 文档阅读助手是一个基于百度千帆大模型平台的Web应用程序,核心是清华大学训练的ChatGLM2大模…

算法加项目

1.仅加号 很简单&#xff0c;找到每次添加后最小的即可&#xff0c;这里不做演示。 2.采药 dp&#xff0c;for1数目&#xff0c;for2时间&#xff0c;简单的dp模板题目。 #include<bits/stdc.h> using namespace std; int n,m; const int N105,M105; long long a[M],b[M…

TInyWebServer面试题

一、项目介绍 &#xff08;1&#xff09;为什么要做这样一个项目&#xff1f; &#xff08;2&#xff09;介绍一下你的项目 这个项⽬是我在学习计算机⽹络和Linux socket编程过程中独⽴开发的轻量级Web服务器&#xff0c;服务器的⽹络模型是主从reactor加线程池的模式&#xf…

VMware虚拟机网络模式配置详解【原理,功能,特点层面】

VMware虚拟机网络模式配置详解【原理,功能,特点层面】 文章目录 VMware虚拟机网络模式配置详解【原理,功能,特点层面】桥接模式&#xff08;Bridged&#xff09;原理功能点介绍虚拟网络编辑器配置虚拟机配置 配置教程编辑-虚拟网络编辑器虚拟机网络配置 特点 NAT模式概念功能点…

数学建模--智能算法之蚁群优化算法

目录 基本原理 算法步骤 Python代码示例 应用领域 特点及改进 蚁群优化算法在解决哪些具体组合优化问题方面表现最为突出&#xff1f; 如何有效地改进蚁群优化算法以提高其收敛速度和避免陷入局部最优的问题&#xff1f; 蚁群优化算法与其他群体智能优化算法&#xff0…

三维旋转矩阵

前言 本文讲述三维旋转的矩阵推导&#xff0c;推导过程遵循下面的规则&#xff1a; 本文的坐标系是基于右手坐标系的逆时针旋转为正向旋转 围绕坐标轴的旋转 x x x轴 我们假设旋转的点为 P P P 假设旋转之前点 P P P的坐标为 ( x 0 , y 0 , z 0 ) (x_0,y_0,z_0) (x0​,y0​,…

CAN总线中注入拓展帧、远程帧,CAPL通用函数。

🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】🍅 玩转CANoe,博客目录大全,点击跳转👉 【测试需求】:CAN总线要求DUT 接收到非预期的扩展帧、远程帧时,通信正常,…

vulhub:nginx解析漏洞nginx_parsing

这个解析漏洞其实是PHP CGI的漏洞&#xff0c;在PHP的配置文件中有一个关键的选项cgi.fix_pathinfo默认是开启的&#xff0c;当URL中有不存在的文件&#xff0c;PHP就会向前递归解析。在一个文件/xx.jpg后面加上/.php会将 /xx.jpg/xx.php 解析为 php 文件 条件&#xff1a; Ngi…

釉面陶瓷器皿和玻璃器皿 SOR/2016-175认证

釉面陶瓷制品和釉面玻璃制品设计用于盛装食品&#xff0c;包括扁平餐具、杯子或马克杯、小号或大号凹形器皿&#xff08;杯子或马克杯除外&#xff09;以及水罐。这些法规适用于以下釉面陶瓷制品和釉面玻璃制品&#xff1a; 完全或部分由陶瓷或玻璃制成完全或部分覆盖含铅或镉…