Spring IoC 和 DI

文章目录

  • 1. 什么是 Spring
  • 2. 什么是 IoC
  • 3. 什么是 DI
  • 4. IoC & DI 使用
  • 5. 获取 Bean 的方式
    • 5.1 根据类型获取 bean
    • 5.2 根据名称获取 bean
    • 5.3 获取bean对象的其他方式
    • 5.4 五大注解的关联
  • 6. 方法注解
  • 7. 扫描路径
  • 8. Bean 的名称
  • 9. DI 详解
    • 9.1 属性注入
    • 9.2 构造方法注入
    • 9.3 Setter方法注入
    • 9.4 三种注入优缺点分析
    • 9.5 @Autowired存在问题
      • 9.5.1 @Primary
      • 9.5.2 @Qualifier
      • 9.5.3 @Resource

1. 什么是 Spring

Spring:是一个开源框架
SpringBoot:可以添加各种依赖,简化开发
SpringMVC:是一种进行web开发的框架(模块)

Spring相当于一个火车,SpringBoot相当于1230,SpringMVC 相当于里面的功能(买票、改签)


Spring 是包含众多工具的 IoC 容器
(比如 tomcat 就是一个 web 容器,list/map 是数据容器)
Spring 容器,装的是对象

2. 什么是 IoC

IoC 是控制反转
就是把对象的控制权交给了 Spring 进行控制
也是一个获取依赖对象的权利的过程


传统方式造车:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


IoC程序开发
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 什么是 DI

DI: Dependency Injection(依赖注⼊)
容器在运⾏期间,动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊

4. IoC & DI 使用

对象的管理:

  1. 存对象:@Component
  2. 取对象:@Autowired

5. 获取 Bean 的方式

Spring 管理的对象都称为 bean

启动类
在这里插入图片描述

5.1 根据类型获取 bean

在这里插入图片描述
在这里插入图片描述
不适合 一个类型对应多个 Bean 对象

5.2 根据名称获取 bean

Spring 帮我们创建对象的时候,会给每一个对象起一个名字

bean 的名称是小驼峰

在这里插入图片描述

在这里插入图片描述

5.3 获取bean对象的其他方式

在这里插入图片描述
在这里插入图片描述

5.4 五大注解的关联

但从功能上来看,除了 Controller,其他效果是一样的
Controller,除了具备让 Spring 管理的功能外,接口的入口,必须为@Controller

五大注解,从概念上还被赋予了别的含义

• Controller:控制层。接收前端发送的请求,对请求进⾏处理,并响应数据
• Service:业务逻辑层。处理具体的业务逻辑
• Dao:数据访问层,也称为持久层。负责数据访问操作,包括数据的增、删、改、查

@Controller:控制层, 接收请求, 对请求进⾏处理, 并进⾏响应
@Servie:业务逻辑层, 处理具体的业务逻辑
@Repository:数据访问层,也称为持久层,负责数据访问操作
@Configuration:配置层,处理项目中的⼀些配置信息


其他的是个注解是 @Component 的衍生类
在这里插入图片描述

6. 方法注解

@Bean
在这里插入图片描述
在这里插入图片描述
@Bean 需要搭配五大注解一起使用

7. 扫描路径

spring 默认扫描路径是 启动类的所在路径

五大注解必须在 spring 扫描路径下,才生效
在这里插入图片描述
通过这个注解来指定Spring的扫描路径
注解默认值是 被该注解标识的类 的所在路径

8. Bean 的名称

Bean 的名称

  1. 五大注解
    类名首字母小写,如果前两位字母均为大写,则为原类名
    也可以指定Bean的名称 指定方法: @Controller(“beanName”)
  2. @Bean
    默认名称:方法名
    也可以指定名称 @Bean(“beanName”)

使用场景

  1. 五大注解 自己开发的程序
  2. @Bean
  1. 存储第三方的对象(代码不在自己的项目中)
  2. 一个类型需要创建多个对象时

9. DI 详解

依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运行时所依赖的资源,⽽资源指的就是对象

简单来说,就是把对象取出来放到某个类的属性中

关于依赖注⼊,Spring也给我们提供了三种方式:

  1. 属性注⼊(Field Injection)
    @Autowired
  2. 构造方法注⼊(Constructor Injection)
  3. Setter 注⼊(Setter Injection)

9.1 属性注入

在这里插入图片描述
在这里插入图片描述

9.2 构造方法注入

在这里插入图片描述
当只有一个构造函数的时候,Spring 会知道使用哪个
当有多个构造函数的时候,优先使用默认的无参的构造函数,如果没有这个构造函数,Spring 会报错
在这里插入图片描述
可以通过 @Autowired 指定构造函数
在这里插入图片描述

9.3 Setter方法注入

在这里插入图片描述

9.4 三种注入优缺点分析

  • 属性注入:
    **优点:**简洁,使用方便
    缺点:
    1.只能⽤于 IoC 容器,如果是非 IoC 容器不可⽤,并且只有在使⽤的时候才会出现 NPE(空指针异常)
    2.不能注⼊⼀个Final修饰的属性
  • 构造函数注入(Spring 4.X推荐)
    优点:
    1.可以注⼊ final 修饰的属性
    2.注⼊的对象不会被修改
    3.依赖对象在使用前⼀定会被完全初始化,因为依赖是在类的构造方法中执行的,而构造方法是在类加载阶段就会执行的方法
    4.通用性好,构造方法是JDK⽀持的,所以更换任何框架,他都是适用的
    缺点:
    注⼊多个对象时,代码会比较繁琐
  • Setter注⼊(Spring 3.X推荐)
    优点:
    ⽅便在类实例之后,重新对该对象进⾏配置或者注⼊
    缺点:
    1.不能注⼊⼀个Final修饰的属性
    2.注⼊对象可能会被改变,因为setter⽅法可能

final 修饰的属性,有一个要求,需要满足一下任意条件

  1. 声明时,完成初始化
  2. 在构造函数中进行赋值

9.5 @Autowired存在问题

在这里插入图片描述
同样类型,存在多个对象时,会发生报错

在这里插入图片描述
Autowired 会先根据名称来获取,如果获取到了,就正常响应
如果没有获取到,就根基类型匹配,此时,如果匹配到多个,就会报错

通常做法:不使用变量名称来指定获取某个 bean,而是通过其他的手段来指定 bean 的名称
通常我们会认为变量名的修改不影响我们的业务逻辑处理

9.5.1 @Primary

在这里插入图片描述

9.5.2 @Qualifier

在这里插入图片描述

9.5.3 @Resource

在这里插入图片描述

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

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

相关文章

残差网络 ResNet

目录 1.1 ResNet 2.代码实现 1.1 ResNet 如上图函数的大小代表函数的复杂程度,星星代表最优解,可见加了更多层之后的预测比小模型的预测离真实最优解更远了, ResNet做的事情就是使得模型加深一定会使效果变好而不是变差。 2.代码实现 impo…

【OpenAI】自定义GPTs应用(GPT助手应用)及外部API接口请求

11月10日,OpenAI正式宣布向所有ChatGPT Plus用户开放GPTs功能 简而言之:GPT应用市场(简称GPTs, 全称GPT Store) Ps: 上图为首次进入时的页面,第一部分是自己创建的GPTs应用,下面是公开可以使用的GPTs应用 一、创建GPTs…

Spring Cloud 微服务中 gateway 网关如何设置健康检测端点

主要是为了让 k8s 识别到网关项目已经就绪,但是又不想在里面通过 Controller 实现。因为在 Controller 中这样做并不是最佳实践,因为 Gateway 的设计初衷是专注于路由和过滤,而不是业务逻辑的处理。 在 Gateway 中配置健康检查端点可以通过以…

单向不带头链表的使用

单向不带头链表的使用 链表的创建&#xff1a; typedef struct LNode {SLDataType data;struct LNode* next; }LNode,*LinkList; 按位查找 LNode* GetElem(LinkList L, int i) {int j 1;LNode* p L->next;if (i < 0)return NULL;if (i 0)return L;while (p &&…

4种方法用Python批量实现多Excel多Sheet合并

目录 方法一&#xff1a;使用pandas库 方法二&#xff1a;使用openpyxl库 方法三&#xff1a;使用xlrd和xlwt库 方法四&#xff1a;使用os和glob库 在数据处理中&#xff0c;经常需要将多个Excel文件中的多个工作表进行合并。以下介绍了4种方法&#xff0c;使用Python批量实…

消费增值模式:引领消费者与平台共创双赢的新篇章

在数字化时代&#xff0c;消费模式正在发生深刻变革。消费者不再满足于单纯的购物行为&#xff0c;而是寻求更加个性化和有价值的消费体验。而平台也面临着如何吸引和留住消费者的挑战。消费增值模式作为一种新型的商业模式&#xff0c;正逐渐成为解决这一问题的关键。 消费增…

Java多线程并发篇----第十八篇

系列文章目录 文章目录 系列文章目录前言一、寄存器二、程序计数器三、PCB-“切换桢”四、上下文切换的活动五、引起线程上下文切换的原因前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了…

3D Guassians Splatting相关解读

从已有的点云模型出发&#xff0c;以每个点为中心&#xff0c;建立可学习的高斯表达&#xff0c;用Splatting即抛雪球的方法进行渲染&#xff0c;实现高分辨率的实时渲染。 1、主要思想 1.引入了一种各向异性&#xff08;anisotropic&#xff09;的3D高斯分布作为高质量、非结…

查看centos的CPU、内存、磁盘空间等配置信息

目录 查看CPU/proc/cpuinfo中的信息 查看内存/proc/meminfo中的信息 查看磁盘空间df 命令du命令使用fdisk命令 查看CPU /proc/cpuinfo中的信息 前置&#xff1a; [ltkjltkj front]$ cat /proc/cpuinfo| grep "physical id" physical id : 0 physical id : 0 physi…

智慧校园大数据平台架构

平台架构 基础硬件层 基础硬件层是由一组低廉的PC或服务器组合构建而成。基础硬件层主要承载着数据的存储、运算、容错、调度和通信等任务,对基础应用层下达的指令进行执行和反馈。 数据集成 大数据特征表现在实时、交互、海量等方面,并且以半结构化、非结构化数据为主,价…

机器学习系统或者SysMLDL笔记

在使用过TVM、TensorRT等优秀的机器学习编译优化系统以及Pytorch、Keras等深度学习框架后&#xff0c;总觉得有必要从理论上对这些系统进行一些分析&#xff0c;虽然说在实践中学习是最快最直接的(指哪儿打哪儿、不会哪儿查哪儿)&#xff0c;但恶补一些关于系统设计的一些知识还…

搜索经典题——填充 9*9矩阵

题目&#xff1a;给定一个九行九列矩阵&#xff0c;填充矩阵元素&#xff0c;要求&#xff1a; 1、每一行每一列&#xff0c;每个小九宫格&#xff08;图片画粗的地方就是&#xff09;不能包含相同元素 2、每一行&#xff0c;每一列&#xff0c;每个小九宫格均会完整出现1-9的数…

Python进程池multiprocessing.Pool

环境&#xff1a; 鲲鹏920:192核心 内存&#xff1a;756G python&#xff1a;3.9 python单进程的耗时 在做单纯的cpu计算的场景&#xff0c;使用单进程核多进程的耗时做如下测试&#xff1a; 单进程情况下cpu的占用了如下&#xff0c;占用一半的核心数&#xff1a; 每一步…

第二百六十九回

文章目录 概念介绍设置方法示例代码内容总结 我们在上一章回中介绍了Card Widget相关的内容&#xff0c;本章回中将介绍国际化设置.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的国际化设置是指在App设置相关操作&#xff0c;这样可以让不同国家的…

SAP PI之Rest adapter

一&#xff0c;简介 REST风格接口是以http为传输协议&#xff0c;以xml或json或text为有效负载。下图展示了REST到XI再返回的一个过程&#xff0c;一个REST接口包含的信息有&#xff1a;服务URL、URL中带的参数、http方法(post/get/put等)、http头部、body部分的有效载荷。而X…

2023年全球软件质量效能大会(QECon北京站):核心内容与学习收获(附大会核心PPT下载)

此次大会的主题为“智能时代的质量新篇章”。来自全球的软件质量与效能专家、企业领袖、技术研发人员等齐聚一堂&#xff0c;共同探讨软件质量与效能的新理念、新技术、新实践。 一、大会的核心内容 1、智能时代软件质量的新挑战与机遇 随着人工智能、大数据等技术的快速发展…

react、Vue打包直接运行index.html不空白方法

react vue 在根目录下创建 vue.config.js 文件&#xff0c;写入 module.exports {publicPath: ./, }

【SpringCloud】这一次终于使用MQ解决了Eureka服务下线延迟感知问题

前言 其实&#xff0c;“通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题”是一种解&#xff0c;但不是最优解 1.痛点 上一篇文章的标题是&#xff1a; 通过Redis手动更新Ribbon缓存来解决Eureka微服务架构中服务下线感知的问题 当时在文章的末尾就…

matlab 直道转向时方向盘最小转角算法

1、内容简介 略 33-可以交流、咨询、答疑 2、内容说明 汽车主动转向&#xff0c;直道转向时方向盘最小转角算法&#xff0c;一个m脚本和simulink的计算结果 略 3、仿真分析 略 4、参考论文 汽车主动转向关键技术研究

黑马程序员_多线程

基础知识 什么是线程 被包含在进程之中&#xff0c; 可以调度的最小单位应用软件中互相独立&#xff0c;可以同时运行的功能 什么是进程 程序的基本执行实体 总结&#xff1a; 什么是多线程&#xff1f; 有了多线程&#xff0c;可以让程序同时做多件事情 多线程有什么作用&…