javaEE-Spring IOCDI

目录

1、什么是Spring:

2.什么是IoC:

3. 什么是控制反转呢? 

4.IoC容器具备以下优点:

5.DI是什么:

依赖注⼊方法:

三种注入方法的优缺点:

@Autowired注解注入存在的问题:

@Autowired和@Resource的区别:

6.IoC和DI的使用:

7.Bean的存储:

8.Bean的命名:

9.ApplicationContext VS BeanFactory

10.Bean的扫描路径:

10.Spring, Spring Boot 和Spring MVC的关系以及区别:

11.

12.Spring框架中的Bean是否是线程安全的:


1、什么是Spring:

Spring是一个开源框架,他让我们的开发更加简单. 他⽀持⼴泛的应⽤场景, 有着活跃⽽庞⼤的社区
,是包含了众多工具方法的IoC容器。

2.什么是IoC:

IoC: Inversion of Control (控制反转), 也就是说 Spring 是⼀个"控制反转"的容器.
IoC 是Spring的核⼼思想,在类上⾯添加 @RestController 和 @Controller 注解, 就是把这个对象交给Spring管理, Spring 框架启动时就会加载该类. 把对象交给Spring管理, 就是IoC思想.

3. 什么是控制反转呢? 

获得依赖对象的过程被反转了。也就是说, 当需要某个对象时, 传统开发模式中需要⾃⼰通过 new 创建对象, 现在不需要再进⾏创建, 把创建对象的任务交给容器, 程序中只需要依赖注⼊ (Dependency Injection,DI)就可以了.

这个容器称为:IoC容器. Spring是⼀个IoC容器, 所以有时Spring 也称为Spring 容器.

4.IoC容器具备以下优点:

资源不由使⽤资源的双⽅管理,⽽由不使⽤资源的第三⽅管理,这可以带来很多好处。

第⼀,资源集中管理,实现资源的可配置和易管理。IoC容器会帮我们管理⼀些资源(对象等), 我们需要使⽤时, 只需要从IoC容器中去取就可以了

第⼆,降低了使⽤资源双⽅的依赖程度,也就是我们说的耦合度。我们在创建实例的时候不需要了解其中的细节。

Spring 就是⼀种IoC容器, 帮助我们来做了这些资源管理.

5.DI是什么:

DI: Dependency Injection(依赖注⼊)

容器在运⾏期间, 动态的为应⽤程序提供运⾏时所依赖的资源,称之为依赖注⼊。程序运⾏时需要某个资源,此时容器就为其提供这个资源。简单来说, 就是把对象取出来放到某个类的属性中.

从这点来看, 依赖注⼊(DI)和控制反转(IoC)是从不同的⻆度的描述的同⼀件事情,就是指通过引⼊ IoC 容器,利⽤依赖关系注⼊的⽅式,实现对象之间的解耦。可以说, DI 是IoC的⼀种实现.

依赖注⼊方法:

 Spring也给我们提供了三种⽅式:

1. 属性注⼊(Field Injection):使用@Autowired实现

2. 构造⽅法注⼊(Constructor Injection):在类的构造⽅法中实现注⼊,搭配@Autowired注解

注意事项:如果类只有⼀个构造⽅法,那么 @Autowired 注解可以省略;如果类中有多个构造⽅法,那么需要添加上 @Autowired 来明确指定到底使⽤哪个构造⽅法

3. Setter 注⼊(Setter Injection):和属性的 Setter ⽅法实现类似,只不过在设置 set ⽅法的时候需要加上 @Autowired 注解 。

三种注入方法的优缺点:

属性注入:

优点:代码简介,使用简单。

 缺点:只能作用于 IoC容器,不能注入final修饰的类。

构造方法注入:

优点:可以注⼊final修饰的属性 ; 注⼊的对象不会被修改;依赖对象在使⽤前⼀定会被完全初始化,因为依赖是在类的构造⽅法中执⾏的,⽽构造⽅法是在类加载阶段就会执⾏的⽅法;通⽤性好, 构造⽅法是JDK⽀持的, 所以更换任何框架,他都是适⽤的。

 缺点:  注⼊多个对象时, 代码会⽐较繁琐

• Setter注⼊

优点: ⽅便在类实例之后, 重新对该对象进⾏配置或者注⼊

 缺点: 不能注⼊⼀个Final修饰的属性;注⼊对象可能会被改变, 因为setter⽅法可能会被多次调⽤, 就有被修改的⻛险

@Autowired注解注入存在的问题:

当同⼀类型存在多个bean时,仅通过类 类型注入时,会找到非唯一的Bean对象。

可以通过一下方法解决:

1. @Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现.

2. @Qualifier注解:通过该注解的value属性,指定当前要注入的Bean的名称;不能单独使用,要搭配@Autowired注解使用。

3.@Resource注解:按照Bean的名称注入,通过name属性指定要注入的Bean的名称。

@Autowired和@Resource的区别:

相同点:

1. @Resource和@Autowired都是做bean的注入时使用。
2.两者都可以写在字段和setter方法上;

不同点:

1.@Autowired是Spring框架提供的注解;@Resource并不是Spring的注解,是JDK提供的注解,它的包是javax.annotation.Resource,需要导入;

2.@Autowired是按照类型注入的,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用;

@Resource是按照名称注入的,@Resource有两个重要的属性: name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

@Resource装配顺序:

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

6.IoC和DI的使用:

Spring 容器 管理的主要是对象, 这些对象, 我们称之为"Bean". 我们把这些对象交由Spring管理, 由Spring来负责对象的创建和销毁(实现作为容器的存和取的功能).

7.Bean的存储:

要把某个对象交给IOC容器管理,需要在类上添加⼀个注解: @Component ,⽽Spring框架为了更好的服务web应⽤程序, 提供了更丰富的注解:
1. 类注解:

@Controller(控制器存储):控制层, 接收请求, 对请求进⾏处理, 并进⾏响应

@Service(服务存储):业务逻辑层, 处理具体的业务逻辑

@Repository(仓库存储):数据访问层,也称为持久层. 负责数据访问操作

@Configuration(配置存储):配置层. 处理项⽬中的⼀些配置信息

@Component(组件存储):该注解是一个元注解,这几个注解是该注解的衍生类。

2. ⽅法注解:@Bean.

分配这么多注解的作用:和应⽤分层是呼应的. 让程序员看到类注解之后,就能直接了解当前类的⽤途。

方法注解的使用场景:

1. 使⽤外部包⾥的类, 没办法添加类注解

2. ⼀个类, 需要多个对象, ⽐如多个数据源 。这种场景, 我们就需要使⽤⽅法注解 @Bean

(方法注解要配合类注解使用)

8.Bean的命名:

程序开发⼈员不需要为bean指定名称(BeanId), 如果没有显式的提供名称(BeanId),Spring容器将为该bean⽣成唯⼀的名称。命名约定使⽤Java标准约定作为实例字段名. 也就是说,bean名称以⼩写字⺟开头,然后使⽤驼峰式⼤⼩写.

⽐如:

类名: UserController, Bean的名称为: userController

类名: AccountManager, Bean的名称为: accountManager

当有多个字符并且第⼀个和第⼆个字符都是⼤写时, 将保留原始的⼤⼩写。

⽐如

类名: UController, Bean的名称为: UController

类名: AManager, Bean的名称为: AManager

9.ApplicationContext VS BeanFactory

获取bean对象, 是ApplicationContext的⽗类BeanFactory提供的功能。

• 继承关系和功能⽅⾯来说:

Spring 容器有两个顶级的接⼝:BeanFactory 和ApplicationContext。其中 BeanFactory 提供了基础的访问容器的能⼒,⽽ApplicationContext 属于 BeanFactory 的⼦类,还实现了多个别的接口,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化⽀持、资源访问⽀持、以及事件传播等⽅⾯的⽀持.

• 从性能⽅⾯来说:延迟加载

1. BeanFactroy 采用的是延迟加载形式来注入 Bean 的,即只有在使用到某个 Bean 时(调用getBean()),才对该 Bean 进行加载实例化。这样,我们就不能发现一些存在的 spring 的配置问题。而 ApplicationContext 则相反,它是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现 Spring 中存在的配置错误

10.Bean的扫描路径:

使⽤五⼤注解声明的bean,要想⽣效, 还需要配置扫描路径, 让Spring扫描到这些注解 也就是通过 @ComponentScan 来配置扫描路径。
在之前的使用中@ComponentScan 注解虽然没有显式配置,但也访问成功了,是因为该注解已经包含在了启动类声明注解@SpringBootApplication 中了,默认扫描的范围是SpringBoot启动类所在包及其⼦包,在配置类上添加 @ComponentScan 注解, 该注解默认会扫描该类所在的包下所有的配置类。

10.Spring, Spring Boot 和Spring MVC的关系以及区别:

Spring:Spring 是⼀个开发应⽤框架,特点是:轻量级、⼀站式、模块化,其⽬的是⽤于简化企业级应⽤程序开发.

Spring的主要功能: 管理对象,以及对象之间的依赖关系, ⾯向切⾯编程, 数据库事务管理, 数据访问, web框架⽀持等。但是Spring具备⾼度可开放性, 并不强制依赖Spring。

Spring MVC: Spring MVC是Spring的⼀个⼦框架, 按照MVC模式设计了⼀个 MVC框架(⼀些⽤Spring 解耦的组件), 主要⽤于开发WEB应⽤和⽹络接⼝,Spring MVC 是⼀个Web框架。

Spring Boot: Spring Boot是对Spring的⼀个封装, 为了简化Spring应⽤的开发⽽出现的,使⽤Spring Boot 可以更加快速的搭建框架, 降级开发成本, 让开发⼈员更加专注于Spring应⽤的开发,⽽⽆需过多关注XML的配置和⼀些底层的实现。

pring MVC和Spring Boot都属于Spring,Spring MVC 是基于Spring的⼀个 MVC 框架,⽽Spring Boot 是基于Spring的⼀套快速开发整合包.

11.

12.Spring框架中的Bean是否是线程安全的:

Spring 框架并没有对单例 Bean 进行任何多线程的封装处理。

关于单例 Bean 的线程安全和并发问题,需要开发者自行去搞定。单例的线程安全问题,并不是 Spring 应该去关心的。 Spring 应该做的是,提供根据配置,创建单例 Bean 或多例 Bean 的功能。但实际上,大部分的 Spring Bean 并没有可变的状态,所以在某种程度上说 Spring 的单例Bean 是线程安全的。如果你的 Bean 有多种状态的话,就需要自行保证线程安全。最浅显的解决办法,就是将多态 Bean 的作用域(Scope)由 Singleton 变更为 Prototype。

13.Spring如何解决循环依赖问题:

循环依赖:循环引用,就是两个或两个以上的bean对象互相持有对方,最终形成了闭环,如:A引用B,B引用C,C又引用A,就形成了循环引用。

处理整个流程大致如下:

1. 首先 A 完成初始化第一步并将自己提前曝光出来(通过 ObjectFactory 将自己提前曝光),在初始化的时候,发现自己依赖对象 B,此时就会去尝试 get(B),这个时候发现 B 还没有被创建出来;

2. 然后 B 就走创建流程,在 B 初始化的时候,同样发现自己依赖 C,C 也没有被创建出来;

3. 这个时候 C 又开始初始化进程,但是在初始化的过程中发现自己依赖 A,于是尝试 get(A)。这

个时候由于 A 已经添加至缓存中(一般都是添加至三级缓存 singletonFactories),通过ObjectFactory 提前曝光,所以可以通过 ObjectFactory#getObject() 方法来拿到 A 对象。 C 拿到 A 对象后顺利完成初始化,然后将自己添加到一级缓存中;

4. 回到 B, B 也可以拿到 C 对象,完成初始化, A 可以顺利拿到 B 完成初始化。到这里整个链路

就已经完成了初始化过程了。

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

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

相关文章

TensorFlow Lite 全面解析:端侧部署方案与PyTorch Mobile深度对比

1 TensorFlow Lite 基础介绍 TensorFlow Lite (TFLite) 是 Google 为移动设备(Android, iOS)、微控制器(Microcontrollers)和其他嵌入式设备(如 Raspberry Pi)开发的轻量级深度学习推理框架。它的核心目标是…

mapbox进阶,使用jsts实现平角缓冲区

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️jsts myBufferOp 缓冲区生成对对象 …

linux装好显卡后如何检查

背景:客户通知装好了显卡,我们去机器上查看一下一. 使用到的命令 watch -n 1 nvidia-smi 可实时查看gpu的使用率nvidia-smi 之查看一次 二、查看内存和显存 内存使用命令 free -h,显存使用 nvidia-smi 这只是查看的navidia, 其他品牌的会不一样

人工智能深度学习——卷积神经网络(CNN)

一、图像卷积运算 对图像矩阵与滤波器矩阵进行对应相乘再求和运算,转化得到新的矩阵。 作用:快速定位图像中某些边缘特征 英文:convolution(CNN)池化层实现维度缩减 池化:按照一个固定规则对图像矩阵进行处…

SaaS 建站从 0 到 1 教程:Vue 动态域名 + 后端子域名管理 + Nginx 配置

SaaS 建站从 0 到 1 教程:Vue 动态域名 后端子域名管理 Nginx 配置 一、什么是 SaaS 建站? SaaS(Software as a Service)建站,就是通过一套统一的系统,支持用户在线注册、绑定域名、快速生成专属网站。…

关于神经网络中回归的概念

神经网络中的回归详解 引言 神经网络(NeuralNetworks)是一种强大的机器学习模型,可用于分类和回归任务。本文聚焦于神经网络中的回归(Regression),即预测连续输出值(如房价、温度)。…

JAVASCRIPT 前端数据库-V9--仙盟数据库架构-—仙盟创梦IDE

老版本 在v1 版本中我们讲述了 基础版的应用JAVASCRIPT 前端数据库-V1--仙盟数据库架构-—-—仙盟创梦IDE-CSDN博客接下载我们做一个更复杂的的其他场景由于,V1查询字段必须 id接下来我们修改了了代码JAVASCRIPT 前端数据库-V2--仙盟数据库架构-—-—仙盟创梦IDE-CS…

k8s核心资料基本操作

NamespaceNamespace是kubernetes系统中的一种非常重要资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。默认情况下,kubernetes集群中的所有的Pod都是可以相互访问的。但是在实际中,可能不想让两个Pod之间进行互相的访问…

PostgreSQL——分区表

分区表一、分区表的意义二、传统分区表2.1、继承表2.2、创建分区表2.3、使用分区表2.4、查询父表还是子表2.5、constraint_exclusion参数2.6、添加分区2.7、删除分区2.8、分区表相关查询2.9、传统分区表注意事项三、内置分区表3.1、创建分区表3.2、使用分区表3.3、内置分区表原…

Linux任务调度全攻略

Linux下的任务调度分为两类,系统任务调度和用户任务调度。系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。/etc/crontab文件包括下面…

回溯算法通关秘籍:像打怪一样刷题

🚀 回溯算法通关秘籍:像打怪一样刷题! 各位同学,今天咱们聊聊 回溯算法(Backtracking)。它听起来玄乎,但其实就是 “暴力搜索 剪枝” 的优雅版。 打个比方:回溯就是在迷宫里探险&am…

嵌入式Linux常用命令

📟 核心文件与目录操作pwd-> 功能: 打印当前工作目录的绝对路径。-> 示例: pwd -> 输出 /home/user/projectls [选项] [目录]-> 功能: 列出目录内容。-> 常用选项:-l: 长格式显示(详细信息)-a: 显示所有文件(包括隐…

深入理解 Linux 内核进程管理

在 Linux 系统中,进程是资源分配和调度的基本单位,内核对进程的高效管理直接决定了系统的性能与稳定性。本文将从进程描述符的结构入手,逐步剖析进程的创建、线程实现与进程终结的完整生命周期,带您深入理解 Linux 内核的进程管理…

ACP(三):让大模型能够回答私域知识问题

让大模型能够回答私域知识问题 未经过特定训练答疑机器人,是无法准确回答“我们公司项目管理用什么工具”这类内部问题。根本原因在于,大模型的知识来源于其训练数据,这些数据通常是公开的互联网信息,不包含任何特定公司的内部文档…

使用Xterminal连接Linux服务器

使用Xterminal连接Linux服务器(VMware虚拟机)的步骤如下,前提是虚拟机已获取IP(如 192.168.31.105)且网络互通: 一、准备工作(服务器端确认)确保SSH服务已安装并启动 Linux服务器需要…

ChatBot、Copilot、Agent啥区别

以下内容为AI生成ChatBot(聊天机器人)、Copilot(副驾驶)和Agent(智能体/代理)是AI应用中常见的三种形态,它们在人机交互、自动化程度和任务处理能力上有着显著的区别。特征维度ChatBot (聊天机器…

2025 年大语言模型架构演进:DeepSeek V3、OLMo 2、Gemma 3 与 Mistral 3.1 核心技术剖析

编者按: 在 Transformer 架构诞生八年之际,我们是否真的见证了根本性的突破,还是只是在原有设计上不断打磨?今天我们为大家带来的这篇文章,作者的核心观点是:尽管大语言模型在技术细节上持续优化&#xff0…

基于Matlab GUI的心电信号QRS波群检测与心率分析系统

心电信号(Electrocardiogram, ECG)是临床诊断心脏疾病的重要依据,其中 QRS 波群的准确检测对于心率分析、心律失常诊断及自动化心电分析系统具有核心意义。本文设计并实现了一套基于 MATLAB GUI 的心电信号处理与分析系统,集成了数…

1台SolidWorks服务器能带8-10人并发使用

在工业设计和机械工程领域,SolidWorks作为主流的三维CAD软件,其服务器部署方案直接影响企业协同效率。通过云飞云共享云桌面技术实现多人并发使用SolidWorks时,实际承载量取决于硬件配置、网络环境、软件优化等多维度因素的综合作用。根据专业…

String、StringBuilder和StringBuffer的区别

目录一. String:不可变的字符串二.StringBuilder:可变字符串三.StringBuffer:线程安全的可变字符串四.总结在 Java 开发中,字符串处理是日常编码中最频繁的操作之一。String、StringBuilder 和 StringBuffer 这三个类虽然都用于操…