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

在这里插入图片描述

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

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

相关文章

代码随想录算法训练营第三十六天|435. 无重叠区间、763.划分字母区间、56. 合并区间

题目&#xff1a;435. 无重叠区间 文章链接&#xff1a;代码随想录 视频链接&#xff1a;LeetCode:435.无重叠区间 题目链接&#xff1a;力扣题目链接 图释&#xff1a; class Solution { public:static bool cmp(const vector<int>&a, const vector<int>…

HDFS读写数据流程、NameNode与DataNode工作机制

文章目录 HDFS 写数据流程HDFS 读数据流程HDFS 节点距离计算HDFS 机架感知HDFS NN和2NN工作机制HDFS FsImage镜像文件HDFS Edits编辑日志HDFS 检查点CheckPoint时间设置HDFS 退役旧数据节点HDFS DataNode多目录配置HDFS DataNode工作机制HDFS 数据完整性HDFS 掉线时限参数设置 …

Configure Virtual Serial Port Driver串口模拟器VSPD

背景 串口通讯想必做硬件开发和软件的人来说都相当了解&#xff0c;以前的电脑&#xff0c;基本标配都包含一个串口。但现在的电脑&#xff0c;基本都没有配置串口了&#xff0c;如果要使用串口的功能&#xff0c;基本就要用一个USB转串口的硬件模块。 虚拟串口&#xff08;虚…

[oeasy]python005_退出游乐场_重启游乐场_系统态shell_应用态_quit

0005_ 退出游乐场_重启游乐场_系统态shell 退出终端_重启游乐场_shell_quit &#x1f94a; Python 回忆 上次 了解了 python进入了 python 游乐场 在游乐场 可以做 简单的计算还可以做 乘方运算 数字特别大之后 游乐场 会迟疑一下不过 最终 还是能算出来 可以让数字 更大一…

【特征工程】分类变量:BinaryEncoder二进制编码方法详解

Binary Encoding&#xff1a;二进制编码方法详解 Binary Encoding是将每个整数表示为二进制数&#xff0c;然后按位拆分为多个二进制变量。这种方法旨在减少维度&#xff0c;同时避免了One-Hot Encoding的高维稀疏问题。 Binary encoding for categorical variables, similar …

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

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

presto 支持regexp_count

一、背景 1、查询regexp_count 函数提示未注册 用户想正则查询特定字符出现次数 function regexp_count not registered 二、调研 1、官网地址&#xff1a; Presto Documentation — Presto 0.284 Documentation 2、regexp_extract_all Regular Expression Functions —…

Js-web APIs(一)

目录 Web API 基本认知 • 作用和分类 • 什么是DOM • DOM树 • DOM对象(重要) 获取DOM对象 • 根据CSS选择器来获取DOM元素 (重点) 1.选择匹配的第一个元素 2.选择匹配的多个元素 • 其他获取DOM元素方法&#xff08;了解&#xff09; 操作元素内容 • 对象.innerT…

Lua从电脑端爬取短视频评论并作商业化分析

之前有个大客户让我写一篇关于抓取短视频评论数据的单子&#xff0c;说是帮助公司寻找意向客户以及所对应产品在短视频里面的展现以及热门程度&#xff0c;通过数据采集方式并作数据自动化分析&#xff0c;从而实现商业上的价值。对于我来说写个爬虫还不简单&#xff0c;通过三…

鸿蒙Harmony-列表组件(List)详解

不要和别人比生活&#xff0c;每个人阶段不同&#xff0c;追求不同&#xff0c;活法自然也不同。只要今天的你能比昨天的你快乐一点点&#xff0c;那你就是自己人生赢家。 目录 一&#xff0c;定义 二&#xff0c;布局与约束 2.1 布局 2.2 约束 三&#xff0c;开发布局 3.1 设置…

DC电源模块在新能源领域的应用前景

BOSHIDA DC电源模块在新能源领域的应用前景 DC电源模块在新能源领域有着广阔的应用前景。随着可再生能源技术的发展和普及&#xff0c;如太阳能和风能等的应用逐渐增多&#xff0c;DC电源模块在这些领域的应用越来越重要。 首先&#xff0c;DC电源模块可以用于太阳能发电系统…

使用micro-app将现有项目改造成微前端,对现有项目实现增量升级

使用micro-app将现有项目改造成微前端&#xff0c;对现有项目实现增量升级 基座应用 1、安装依赖 npm i micro-zoe/micro-app --save2、在入口引入 //main.js import microApp from micro-zoe/micro-appnew Vue({ }) //在new Vue 下面执行 microApp.start()3、新增一个vue页…

【目标检测】评价指标:mAP概念及其计算方法(yolo源码/pycocotools)

本篇文章首先介绍目标检测任务中的关键评价指标mAP的概念&#xff1b;然后介绍其在yolo源码和pycocotools工具中的实现方法&#xff1b;最后比较两种mAP的计算方法的不同之处。 目标检测中的评价指标&#xff1a; mAP概念及其计算方法(yolo源码/pycocotools) 混淆矩阵概念及其…

ArcGIS Pro中怎么加载在线地图

当我们在制图的时候&#xff0c;有的时候需要加载在线地图&#xff0c;在ArcGIS Pro中加载在线地图的方式有很多&#xff0c;这里为大家介绍一下加载的方法&#xff0c;希望能对你有所帮助。 加载底图 在菜单栏上选择地图&#xff0c;点击底图&#xff0c;可以看到所有可加载…

FTP文件传输协议 、多种方式安装yum仓库

一、网络文件共享服务 1.存储类型分三种&#xff1a; 直连式存储&#xff1a;Direct-Attached Storage&#xff0c;简称DAS 存储区域网络&#xff1a;Storage Area Network&#xff0c;简称SAN&#xff08;可以使用空间&#xff0c;管理也是你来管理&#xff09; 网络附加存储…

maxwell同步全量历史数据

CentOS安装maxwell 在上篇的基础上&#xff0c;我们实现了实时同步mysql数据到kafka。maxwell不仅可以同步实时数据&#xff0c;也可以同步全量历史数据。在这里模拟一下历史数据的场景&#xff0c;创建表结构如下&#xff0c;并写入测试数据。 CREATE TABLE user_det…

手把手教你搭建一个数据可视化看板

前言 俗话说的好&#xff0c;“字不如表&#xff0c;表不如图”、“有图有真相&#xff0c;一图胜千言”。 数据可视化就是用图的形式把基础数据直观&#xff0c;简洁的&#xff0c;高效的展示出来&#xff0c;今天为大家介绍一下如何使用葡萄城公司的嵌入式BI工具——Wyn商业…

JavaScript的Class基本语法

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 JavaScript是一种基于原型的语言&#xff0c;但在ES6中引入了class关…

成功解决VScode进入到内置函数中调试

主要有两个关键步骤&#xff0c; 第一步 将launch.json中的"justMyCode"设为false 可通过使用ctrlshiftP搜索lauch.json找到次文件 如果找不到的话&#xff0c;可点击debug按钮&#xff0c;然后找到点击create a launch.json file创建 创建得到的launch.json如下&am…

32单片机RTC时间接续,掉电时间保存

1、实现思路 前提&#xff1a;首先要实现RTC掉电之后时间还能继续走&#xff0c;RTC电池是必要的 说明&#xff1a;设备第一次启动需要初始化配置RTC&#xff0c;但当二次启动再重新配置RTC会导致RTC计数器置零&#xff0c;所以传统的程序流程是不行的&#xff0c;我们需要知…