浅谈Spring中的一些技术

一、前言

        在学习Spring或者SpringBoot原理时,心里要始终想着一件事情:只有把对象(也可以称之为组件、bean)放入到Spring的IOC容器中,才能使用Spring为我们提供的一系列强大功能。

二、一些说明

        在学习Spring或者SpringBoot的过程中,我们经常听到 <组件>、<bean>这两个词,那么这两个词指代什么呢?个人的一些浅显理解:你就把这两个词理解成普通的Java对象就可以,比如你自己写的一个User类(你创建一个User对象,把其添加到Spring的IOC容器中,这个User对象就可以称之为一个User组件,或者称之为一个bean组件),你创建了第三方的某个类的对象,然后把其放入Spring的IOC容器中,就可以这样说:我在容器中放入了某个类的一个组件。

三、添加组件(bean)到容器中

       如何把自己写的对象(或称之为组件,或称之为bean)或者第三方组件放入到IOC容器中呢?有四种方式:

3.1 包扫描 + 组件标注注解

        即在某个配置类(配置类指的是标注了@Configuration注解的类)上标注@ComponentScan(basePackages={"包名1","包名2"}), 然后再类上标注@Component、@Repository、@Service、@Controller等注解的方式。

        注意:此种方式局限于想要把自己写的类添加到IOC容器中。

3.2 @Bean

        在配置类中使用@Bean的方式给容器中导入一个组件。使用这种方式可以把第三方包中的组件导入到IOC容器中,让IOC容器帮我们管理第三方的组件,当需要使用第三方组件时,再从容器中获取就好了。

3.3 @Import

3.3.1 @Import导入普通组件

        @Import(要导入到容器中的组件);容器中就会自动注册这个组件,id默认是全类名。比如你创建了一个com.example.User类,使用@Import(value={User.class})就可以给容器中导入一个User组件。

3.3.2 @Import(value={xxxImportSelector.class})

        可以实现ImportSelector接口,然后实现接口中的 selectImports方法,让这个方法返回需要导入容器中的组件的全限定类名数组。然后使用 @Import(value = {MyImportSelector.class})的方式可以一次性给容器中导入多个组件。

3.3.3 @Import(value={xxxImportBeanDefinitionRegistrar.class})

        可以实现 ImportBeanDefinitionRegistrar 接口,然后实现接口中的 registerBeanDefinitions 方法,在方法的实现中手动注册 BeanDefinition 到IOC容器中。然后使用 @Import(value = {MyImportBeanDefinitionRegistrar.class})的方式给容器中导入组件。

3.4 使用FactoryBean

        使用Spring提供的 FactoryBean(工厂Bean):

         1)、默认获取到的是工厂bean调用getObject创建的对象

         2)、要获取工厂Bean本身,我们需要给id前面加一个&前缀

二、单例还是多例

        导入到容器中的组件,是单例还是多例呢?默认存放在Spring IOC容器中的组件都是单例的,当然我们也可以控制放入IOC容器中的组件是否单例还是多例。比如在使用 @Bean给容器中放入组件时,可以使用 @Scope(value = "singleton") 或者 @Scope(value = "prototype") 控制你要放入到IOC容器中的组件是否为单例。

三、Bean的生命周期

        把组件放入到IOC容器中,就意味着我们把一个对象交给了Spring 的IOC容器管理。每一个组件在IOC容器中都是有生命周期的。组件的生命周期概况起来有如下四个阶段:

bean的对象创建(调用bean的构造方法创建对象) -> 给bean进行属性赋值 -> 后置处理器的前置处理方法 -> 初始化 -> 后置处理器的后置处理方法 -> 销毁bean

bean对象创建,主要分为单实例bean的创建和多实例bean的创建:

1)单实例bean:在容器启动时创建所有的单实例bean;

2)多实例bean:在每次获取bean组件时,都会创建新的bean。

bean的属性赋值(见第四小节)

后置处理器的前置处理方法 -> 初始化 -> 后置处理器的后置处理方法 -> 销毁bean

针对bean的初始化前后,还可以做一些其他工作,有BeanPostProcessor来完成.BeanPostProcessor.postProcessBeforeInitialization (在初始化方法执行之前进行后置处理工作
<调用初始化方法>
BeanPostProcessor.postProcessAfterInitialization  (在初始化方法执行之后进行后置处理工作
<销毁bean>

其中bean的初始化和销毁方式有如下几种:

(a) 通过@Bean注解指定 initMethod和destroyMethod 
(b) 让bean实现 InitializingBean 和 DisposableBean 接口
(c) JRS250提供的注解:@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法@PreDestroy:在容器销毁bean之前通知我们进行清理工作 

四、属性赋值

        在给组件中的属性赋值时,我们可以使用@Value的方法,@Value可以写普通字符串,SpEL表达式,可以从配置文件中通过${xxx}的方式取值,需要把配置文件通过 @PropertySource引入进来,使配置文件中k/v键值对被Spring读取到运行时环境变量里面;

五、组件之间的依赖注入

        组件之间会有依赖关系,比如xxxService依赖xxxDao组件,可以Spring或Java规范为我们提供的组件注入功能,如@Autowired + @Qualifier指定要注入的组件,Java规范里面的@Resource和@Inject注解。

        疑问1:为什么标注了@Autowired注解之后,组件就自动给其属性进行了赋值呢?这就是组件注入的后置处理器(xxxPostProcessor)在底层进行工作。 

        疑问2:Spring在底层给IOC容器中注入了一些有用的组件,如果我们想把这些底层组件注入到我们自定义的组件中该怎么做呢?可以让自定义的组件实现Spring给我们提供的各种xxxAware接口,然后Spring在把我们自定义的组件添加到容器中的时候,会应用xxxAware对应的后置处理器,把其底层的组件注入到我们自定义的组件中。

        疑问3:我还想让一些组件在特定条件下才注入到容器中,而不是无脑往容器中注入,该怎么办呢?可以使用@Import的,指定自定义的实现了ImportSelector接口的类,在自定义的实现类中进行进行条件控制,从而控制是否要导入哪些组件,还可以通过指定@Condition注解,需要我们自己实现 Condition接口,在接口中判断是否要导入某些组件。

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

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

相关文章

django学习入门系列之第四点《案例 登录》

文章目录 前期准备&#xff1a;步骤整体代码往期回顾 前期准备&#xff1a; 宽度 居中内边距表单 步骤 先准备一个框&#xff0c;作为登录界面的容器 .frame{height: 380px;width: 600px;margin: 150px auto 0;border: 1px solid black;}将里面输入登录样式内容&#xff08;…

Towards Deep Learning Models Resistant to Adversarial Attacks

这篇论文的主要内容是关于开发对抗攻击具有抗性的深度学习模型。对抗攻击是通过对输入数据进行微小且精心设计的扰动&#xff0c;诱使深度学习模型做出错误的预测。这种攻击在图像识别、语音识别和自然语言处理等任务中尤为突出。 这篇论文的主要内容是关于开发对抗攻击具有抗…

Redis---8---哨兵(sentinel)

Redis—8—哨兵&#xff08;sentinel&#xff09; 是什么 吹哨人巡查监控后台master主机是否故障&#xff0c;如果故障了根据*** 投票数 *** 自动将某一个从库转换为新主库&#xff0c;继续对外服务。 作用&#xff1a; 俗称&#xff0c;无人值守运维 ​ 1&#xff0c;监控…

基于深度学习的异常行为检测

基于深度学习的异常行为检测是一种通过分析视频或传感器数据自动检测异常行为的技术&#xff0c;广泛应用于公共安全、工业监控、金融欺诈检测等领域。异常行为检测旨在识别与正常行为模式不同的异常活动&#xff0c;从而及时预警和采取措施。以下是关于这一领域的系统介绍&…

layui-表单(输入框)

1.基本使用方法 先写一个表单元素块 form 加上layui-form 里面写行区块结构&#xff0c;如下&#xff1a; 2.输入框选项 placeholder默认文本 autocomplete自动填充 lay-verify required必填

社交媒体原生应用开发:Facebook的创新之路

摘要 在数字化时代&#xff0c;社交媒体的原生应用开发已成为连接用户与平台的桥梁。Facebook作为全球领先的社交媒体平台&#xff0c;其原生应用的开发经验为行业提供了宝贵的参考。 关键词 社交媒体&#xff0c;原生应用开发&#xff0c;Facebook&#xff0c;用户体验&…

报错:CodeArts部署Java/SpringBoot/SpringCloud项目报错:Deploy task execution failed.

背景&#xff1a; 目前想要部署SpringCloud服务&#xff0c;使用页面传参的方式。但是传参后&#xff0c;部署报错。错误如下&#xff1a; [2024/06/28 18:09:29.114 GMT08:00] ok: [1_***.***.***.226] > { [2024/06/28 18:09:29.114 GMT08:00] "msg": &quo…

芯片的PPA-笔记

写在前面&#xff1a;这个仅记录自己对芯片PPA的一些思考&#xff0c;不一定正确&#xff0c;还请各位网友思辨的看待&#xff0c;欢迎大家谈谈自己的想法。 1 此次笔记的起因 记录的原因&#xff1a;自己在整理这段时间的功耗总结&#xff0c;又看到工艺对功耗的影响&#x…

Spring AOP源码篇二之 代理工厂ProxyFactory学习

了解AspectJ表达式以及PointCut、Advice、Advisor后&#xff0c;继续学习Spring AOP代理工厂 AspectJ表达式参考&#xff1a;Spring AOP之AspectJ表达式-CSDN博客 PointCut、Advice、Advisor参考&#xff1a;Spring AOP源码篇一之 PointCut、Advice、Advisor学习-CSDN博客 简单…

H5 Canvas实现转盘效果,控制指定数字

效果图 实现思路&#xff1a; 用Canvas画圆&#xff0c;然后再画扇形&#xff0c;然后中奖的开始用一张图片代替&#xff0c;点击的时候触发转动效果。 实现代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><tit…

前端文件预览汇总

一、vue中预览word、excel、pdf&#xff1a; vue-office vue-office支持多种文件(docx、excel、pdf)预览的vue组件库&#xff0c;支持vue2/3&#xff0c;也支持非Vue框架的预览。 特点&#xff1a; 一站式&#xff1a;提供word(.docx)、pdf、excel(.xlsx, .xls)多种文档在线…

C# 键值对的使用

在C#中&#xff0c;键值对&#xff08;Key-Value Pair&#xff09;通常在字典&#xff08;Dictionary<TKey, TValue>&#xff09;数据结构中使用&#xff0c;它允许你根据一个唯一的键&#xff08;Key&#xff09;来存储和检索一个值&#xff08;Value&#xff09;。下面…

MQ:RabbitMQ

同步和异步通讯 同步通讯: 需要实时响应,时效性强 耦合度高 每次增加功能都要修改两边的代码 性能下降 需要等待服务提供者的响应,如果调用链过长则每次响应时间需要等待所有调用完成 资源浪费 调用链中的每个服务在等待响应过程中,不能释放请求占用的资源,高并发场景下…

在Java项目中集成单元测试与覆盖率工具

在Java项目中集成单元测试与覆盖率工具 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 单元测试是软件开发中至关重要的一环&#xff0c;它用于验证代码在独立…

排序——交换类排序、插入类排序、选择类排序、归并类排序

排序 排序算法分为交换类排序、插入类排序、选择类排序、归并类排序。 交换类排序 冒泡排序 冒泡排序的基本思想是&#xff1a;从后往前&#xff08;或从前往后&#xff09;两两比较相邻元素的值。若A[ j - 1 ] > A[ j ]&#xff0c;则交换它们&#xff0c;直到序列比较…

commonjs、module 模块同时启动

怎样同时在一个项目中同时启动node服务和我们前端项目&#xff08;commonjs、module 模块同时启动&#xff09; 今天在使用node实现完增删改查的接口之后&#xff0c;将自己node代码嵌入到我们react项目中 启动完前端项目之后&#xff0c;当我使用node service.js的时候&#x…

Unity渲染管线介绍

Unity中的渲染管线渲染场景主要分为三个阶段 剔除&#xff08;Culling&#xff09; 剔除摄像机不可见对象&#xff08;视锥体剔除Frustum Culling&#xff09;和被遮挡对象&#xff08;遮挡剔除Occlusion Culling&#xff09;。 渲染&#xff08;Rendering&#xff09; 将可见…

Unity 简单载具路线 Waypoint 导航

前言 在游戏开发和导航系统中&#xff0c;"waypoint" 是指路径中的一个特定位置或点。它通常用于定义一个物体或角色在场景中移动的目标位置或路径的一部分。通过一系列的 waypoints&#xff0c;可以指定复杂的移动路径和行为。以下是一些 waypoint 的具体用途&…

用Python轻松转换PDF为CSV

数据的可访问性和可操作性是数据管理的核心要素。PDF格式因其跨平台兼容性和版面固定性&#xff0c;在文档分享和打印方面表现出色&#xff0c;尤其适用于报表、调查结果等数据的存储。然而&#xff0c;PDF的非结构化特性限制了其在数据分析领域的应用。相比之下&#xff0c;CS…

Three 颜色Color

构造器&#xff08;Constructor&#xff09; Color( r : Color_Hex_or_String, g : Float, b : Float ) r - (可选参数) 如果参数g和b被定义&#xff0c;则r表示颜色中的红色分量。 如果未被定义&#xff0c;r可以是一个十六进制 hexadecimal triplet 颜色值或CSS样式的字符串…