Spring-1-Spring中引入loC和DI

控制反转和依赖注入

IoC 核心是 DI 旨在提供一种更简单的机制来设置组件依赖项,并在整个生命周期中管理这些依赖项 需要某些依赖项的组件通常被称为依赖对象,或者在 IoC 的情况下被称为目标对象 通常, IoC可以分解为两种子类型 依赖注入和依赖查找。

这些子类型被进一步分解为 IoC 服务的 体实现 通过这个定义可以清楚地看到,当谈论 DI 时,通常是在谈论 IoC ,而当谈论 IoC 时,则并不总是在谈论 DI(例如,依赖查找也是 IoC种形式)。

控制反转的类型

  • 依赖查找:组件必须获取对依赖项的引用
  • 依赖注入:依赖项将通过 IoC 容器注入组件

依赖查找有两种类型 依赖拉取 DL 和上下文依赖查找CDL。

依赖注入 也有两种常见的风格:构造函数和 setter 依赖注入。

依赖拉取

依赖拉取是种最常见的 IoC 类型。
在这里插入图片描述

上下文依赖查找

在这里插入图片描述

构造函数依赖注入

当在组件的构造函数中提供依赖项时,就会发生构造函数慌攒注人。首先,组件声明一个或一组构造函数,并将其依赖项作为参数,然后在组件实例化时由 IoC 容器将依赖项传递给组件。
在这里插入图片描述

setter 依赖注入

setter 依赖注入中, IoC 容器通过 Bean 样式 setter 方法注入组件的依赖工页。组件的 setter 方法公开了 IoC
容器可以管理的依赖项。

Spring中的控制反转

如前所述,控制反转是Spring的重要组成部分。Spring实现的核心是基于依赖注入,尽管也提供了依赖查找功自动将协作者提供给依赖对象时,是使用依赖注入实现的。在基于Spring的应用程序中,始终优先使用依赖注入将协作者传递给依赖对象,而不是让依赖对象通过查找获取协作者。

虽然依赖注入是将协作者和依赖对象连接在一起的首选机制,但有时仍然需要使用依赖查找来访问依赖对象。必须使用依赖查找来访问初始组在许多环境中,Spring无法通过使用依赖注入来自动连接所有应用程序组件,并且
件组。

在这里插入图片描述Spring IoC 容器有个非常有趣的功能,可以在自己的依赖注入容器和外部依赖查询容器之间充当适配器。

Spring 中的依赖注入

Spring 的依赖注入容器的核心是 Beanfactory 接口。

Beanfactory 责管理组件,包括依赖项以及它们的生命周期, 术语 bean用于引用由容器管理的任何组件。

如果应用程序只需要 DI 支持,则可以通过 BeaoFactory 接口与 Spring DI 容器进行交互,这种情况下,应用程
必须创建个实现了 Beanfactory 接口的类的实例,并使用 bean 和依赖信息对其进行配置。

所有这些设置都是自动处理的(例如,在 Web 应用中, Web 容器将在应用程序启动期间通过web.xml描述符文件中声明的 ContextLoaderListener类启动 Spring的ApplicationContext。

bean 配置由实现 BeanDefinition 接口的类的实例表示。
bean 配置不仅存储有关 bean 本身的信息,还存储有关它所依赖的 bean 的信息。
对于任何实现了 BeanDefinitionReader 接口的 Beanfactory 实现类来说,都可以通过使用PropertiesBeanDefinitionReader或XmlBeanDefinitionReader从配置文件中读取BeanDefinition 数据。
PropertiesBeanDefinitionReader 从属性文件读取 bean 定义,而 XmlBeanDefinitionReader则从xml文件中读取相关信息。

BeanFacto 中识别自己的 bean ,为 bean 分配一个 ID、一个名称或两者兼具。一个 bean可以在没有任何 ID或名称的情况下被实例化,或者作为另一个 Bean 的内部bean 被实例化。

每个 bean至少有一个名称,但也可以有任意数量名称,名称用逗号分割。第一个名称后面的任何名称可以认为是同一个 bean的别名 。可以使用 bean ID 或名称从 BeanFactory 检索一个 bean ,并建立依赖关系(也就是说 beanX 赖于 beanY)

ApplicationContextAware

需要访问ApplicationContext,可以实现ApplicationContextAware接口,,它为ApplicationContext对象强制实现一个 setter。Spring IoC 容器会自动进行检测 并且注入 bean 段创建时所在的ApplicationContext。

自动装配

Spring支持五种自动装配模式。

  • byName模式:当使用byName模式进行自动装配时,Spring会尝试将每个属性连接到同名的bean。因此,如果目标bean具有名为foo的属性并且在ApplicationContext中定义了foo bean,那么 foo bean将被分配给目标bean的foo属性。
  • byType模式:当使用byType进行自动装配时,Spring通过在ApplicationContext中自动使用相同类型的bean来尝试连接目标bean模式的每个属性。
  • 构造函数模式:该模式与byType模式在功能上是相同的,只不过使用的是构造函数而不是setter来执行注入。Spring试图匹配构造函数中最大数量的参数。所以,如果bean有两个构造函数,一个接收一个String,另一个接收一个Suring和一个Integer,并且ApplicationContext中有一个String和一个Integer bean,那么 Spring将使用带有两个参数的构造函数。
  • 默认模式:Spring将自动在构造函数模式和byType模式之间进行选择。如果bean有一个默认的(无参数)构造函数,那么 Spring使用byType模式;否则,就使用构造函数模式。
  • 无:这是默认设置。

当有多个相同Bean时,但是无法选择在哪里使用哪个bean。时有两种方法可以解决这个问题。

第一种方法是,在希望Spring首先考虑自动装配的bean定义中使用primary属性,并将其设置为tue。
另一种解决方案是命名bean并通过XML将它们配置到要注入的地方(这种方法可以完全控制将哪些bean注入到哪里)。

当存在bean相关的类型时,如果能够指定自动装配应按名称完成,那将是非常有用的。想要完成上述操作,需要使用@Qualifier和@Autowired注解,并提供被注入的bean的名称作为参数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Isaac Sim 仿真机器人urdf文件导入

本教程展示如何在 Omniverse Isaac Sim 中导入 urdf 一. 使用内置插件导入urdf 安装urdf 插件 方法是转到“window”->“Extensions” 搜索框中输入urdf, 并启用 通过转至Isaac Utils -> Workflows -> URDF Importer菜单来访问 urdf 扩展。 表格中的 1,2,3 对应着…

从零实现一套低代码(保姆级教程) --- 【6】在项目中使用redux状态管理

摘要 在上一篇文章中的末尾,我们也完成了Input组件的属性面板配置。现在我们的低代码项目已经小有成就了。但是后面的内容还是不少的。 如果你是第一次看到这篇文章,那么请移步到第一节: 从零实现一套低代码(保姆级教程&#xf…

抖店只能做和营业执照对照的产品吗?开店基础教程,新手可收藏!

我是王路飞。 抖店的营业执照有多重要呢?关系到你店铺的类型、类目和产品。 尤其是适合新手做的个体店,不涉及对公账户,货款可以直接提现到你的私人银行卡里,保证金也只有企业店铺的一半。 (只需要身份证就能开通的…

Python入门之数据结构篇

文章目录 准备工作一、数组1.1 简单使用1.2 数组函数1.3 数组方法1.4 列表推导1.5 数组切片 二、元组(tup)2.1 简单使用2.2 元组函数 三、字典(Dictionary)3.1 简单使用3.2 字典函数:关于Python技术储备一、Python所有…

Vue.js学习笔记(1)——Visual Studio Code搭建Vue.js框架

1 开通高德地图API服务 1、进入高德地图API官网(https://lbs.amap.com/): 2、注册登录。 3、进入控制台。 4、点击“应用管理”,点击“我的应用”,创建新应用。 5、添加Key,服务平台选择“Web端&#xff…

MMDetection中的数据处理

CustomDataset 代码路径:mmdet/datasets/custom.py mmdet中的CustomDataset继承自torch的Dataset,因此,对应的需要实现3个虚函数,接下来我们首先看看这3个重要函数的实现。 构造函数 CLASSES None # static变量def __init__…

关于勒索软件盛行,LockBit网络攻击者气焰嚣张的动态情报

一、基本内容 在过去一周内,LockBit团队颇为高调,他们对关键组织、政府和企业发动了一系列的攻击。该勒索软件团队发动的攻击数量远远超过其他所有的勒索团队,CSEM事件为近期勒索事件画上了句号 二、相关发声情况 2023年8月30日&#xff0…

数据库原理知识点清晰总结

数据库基础知识 数据库系统结构 数据库管理系统 数据库设计 关系数据库 关系数据库标准语言SQL 关系数据库规范化理论 数据库保护技术 视图 存储过程 触发器 数据的锁定

[uniapp] 文件查找失败:‘./iconfont.woff?t=1703574566334‘

uniapp 报错 文件查找失败:‘./iconfont.woff?t1703574566334’ uniapp引入图标的时候如果没有处理,就会报这个错误,这个错误是因为字体图标用的相对路径,uniapp不允许, 所以要解决这个错误,只需要我们去到iconfont.css文件内将相对路径改为绝对路径就好 改成 …

【模型部署入门 一】:Pytorch图像分类模型转换ImageNet1000类预训练模型转ONNX

入门学习主要是跟随同济子豪兄,很感谢该博主,本博客代码主体是子豪兄的,我只是总结加工整理记录。 子豪兄对应学习视频链接地址为:ImageNet1000类预训练模型转ONNX 我自己总结的教程中代码使用任何python编译环境都可以直接打开…

Linux系统--账号和权限管理

目录 一、Linux安全模型 二、用户账号和组账号 2.1 用户帐号类型 2.2 组账号 2.3 用户和组的关系 三、两个重要文件夹 3.1 用户账号文件/etc/passwd 3.2 /etc/shadow 四、用户命令 4.1 useradd命令——添加用户 4.2 passwd命令——密码管理 4.3 usermod命令—…

北科智慧智能手提箱旗舰版惊艳亮相2023(香港)智能科技展

2023年12月8日,北科智慧团队在粤港澳大湾区创新发展峰会暨侨交会2023(香港)智能科技展上举办新品发布,推出三款自主研发科技产品:智能手提箱高级版和旗舰版,以及智能呈批夹。新品一经推出,便受到…

PMP®项目管理,2024年1月4日开课啦~想了解的提前查看!

PMP项目管理认证 1🈷4日开课~ 想报名的提前预约啦 👇👇👇 👆(以上是PMP课程内容) 课程介绍 PMP(Project Management Professional)是由美国项目管理协会(…

Kubernetes的理论基础

k8s:kubernetes:8个字母省略,就是k8s。 自动部署,自动扩展和管理容器化部署的应用程序的一个开源系统。k8s是负责自动化运维管理多个容器化程序的集群,是一个功能强大的容器编排工具。分布式和集群化的方式进行容器管理。 1.15 1.18 1.20 1…

vue 基础学习 一

1. vue 使用快速入门三步走 (1) 新建 HTML 页面&#xff0c;引入 Vue.js文件 1 2 3 4 5 6 7 <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>Vue.js 入门示例</title> <script src"https://cdn.j…

Python如何实现邮件的发送

python笔记- 发送邮件 依赖&#xff1a; Python代码实现发送邮件&#xff0c;使用的模块是smtplib、MIMEText&#xff0c;实现代码之前需要导入包&#xff1a; import smtplib from email.mime.text import MIMEText 使用163邮件发送邮件&#xff0c;具体代码实现如下&#x…

计算机毕业设计选题推荐,ssm诗词打卡微信小程序 44669(赠送源码数据库 )上万套实战教程手把手教学JAVA、PHP,node.js,C++、python、数据可视化等

诗词打卡微信小程序 摘要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;诗词打卡微信小程序被用户普遍使用&…

Cron介绍,以及常见的cron表达式

目录 一.cron介绍 1.什么是Cron&#xff1f; 2.Cron语法 时间字段的取值范围如下&#xff1a; 时间字段支持以下特殊字符&#xff1a; 下面是一些示例&#xff1a; 3.虚拟机安装cron(centos7展示) 二.常见的cron表达式 一.cron介绍 1.什么是Cron&#xff1f; Cron是一个…

视频物体对象追踪AI技术模型——Tracking Any Object Amodally

项目地址&#xff1a;https://tao-amodal.github.io 论文&#xff1a;https://arxiv.org/abs/2312.12433 GitHub&#xff1a;GitHub - WesleyHsieh0806/TAO-Amodal: Official Code for Tracking Any Object Amodally AIGC专区&#xff1a;aigc 更多消息&#xff1a;AI人工智能行…