Spring专题

news2024/12/22 14:12:27

存于一级缓存,为了解决循环依赖问题。

纯净态,对象仅仅被实例化,由BeanFactory创建实例。

单例Map,也就是单例池,也就是一级缓存,处于成熟态的bean会加入到单例池中。

简述springioc加载bean的过程。

        bean形态的转变过程:

                概念态>定义态>纯净态>成熟态

                        1、创建ioc容器ApplicationContext,bean被加载到BeanDefinition,用户后续创建对象,比如id、classs、lazy、scope这些都会加载进BeanDefinition中。

                        2、BeanFactory创建bean的实例,存入一级缓存,用于解决后续的循环依赖问题。

                        3、BeanFactory为实例注入属性,对象加入到单例池(一个Map),也就是加入到一级缓存。

注意,创建的对象是单例的。

@Bean相当于xml的<bean>

bean在初始化和销毁的时候,分别由各自的回调方法。

条件:

        1、手动创建的bean,也就是类。

        2、配置类。包括@Configuration和和@Bean

        3、启动项目的时候,手动创建容器AnnotationConfigApplicationContext,通过手动创建的容器加载bean,模拟ApplicationContext加载bean。

        4、关闭容器,applicaitonContext.close(),加载过的bean会销毁。

注意,在bean初始化(通过容器获取bean的时候会初始化bean)和销毁(关闭容器)的时候,我们可以在这两个节点分别自定义两个回调方法用户处理我们需要的业务。

bean的类中别出现@Component、@Service、@Configuration,会直接导致配置类不生效,这也正说明了,配置类@Configuration的执行优先级高于bean类中的@Component,bean类后续被容器再次创建从而覆盖了配置类中设置的处理逻辑。

bean中的类被配置类使用,由配置类通过容器创建对象。

@Componet、@Configuration、@Service的意思就是告诉ApplicationContext创建对象。

某个类使用了@Componet,说明这个类无法配置初始化和销毁的回调方法。

简述bean生命周期中的回调方法的几种实现方法以及这几种方法的执行顺序。

        bean在初始化和销毁,这两个状态的时候,可以执行回调方法。

                有三种方式实现回调

                        1、注解。@PostConstruct初始化(容器加载bean的时候会初始化bean)的回调,@PreDestroy销毁(容器close的时候会销毁所有加载的bean)时的回调。

                        2、接口。InitializingBean和Disposiable分别override afterPropertiesSet()和destroy()

                        3、通过注解的属性指定回调方法@Bean。等同于使用xml的<bean>方式创建对象,同样会触发回调方法。属性分别为initMethod和destroyMethod,值是回调方法名,注意,类中若添加了@Componet,那么在该类被加载的时候,是没办法加载回调方法的,写了也没有用。

                执行顺序:注解>接口>通过注解的属性指定回调方法。

说说循环依赖。

@Component表示class BeanA是容器需要创建的bean。容器就是用来创建bean的。

创建bean包括:实例化和属性注入。

注入属性时,解析autowire发现需要注入BeanB,此时到容器中去寻找beanB,发现容器中没有,故容器实例beanB并注入属性,解析autowire发现beanA,故到容器中找beanA,找不到beanA,容器创建beanA,如此循环,却无法创建beanA和beanB的现象。

容器中的对象必须完成实例化和属性注入,否则对象无法加入容器。

autowire就是用来为属性注入容器中必须存在的bean。

Spring如何解决bean的循环依赖?

使用三级缓存,也就是三个map。

缓存和map关系匪然。map用来做缓存。

A的实例,A的bean,A的动态代理。

函数接口,参数是A的实例和A的名称,方法实现的逻辑是创建aop。调用函数接口创建的是A的动态代理。

循环依赖:A依赖B,B依赖A

多重循环依赖:A依赖B和C,B和C又分别依赖A。

二级缓存的作用:多重循环依赖的情况下,避免A的代理被第二次创建。A的代理只需要一个。从二级缓存中获取到A的代理后,就不会去三级缓存中调用函数接口再次创建A的动态代理了。

属性赋值操作,赋值的对象可以是代理或者bean,唯独不能是实例。在A初始化之后,就会创建A的动态代理,没有循环依赖的对象是在初始化后创建代理。

在A的属性赋值时候创建A的动态代理,否在B属性赋值时,赋的是A的实例而不是A的动态代理,这是有问题的。

多例bean每次使用都要重新创建,既然每次都重新创建,就没有必要用缓存,况且多例bean没有使用缓存一说。

至少有一个缓存,存储了早期对象,A依赖B,创建B的时候发现依赖A,此时从缓存中拿到A的早起对象,就可以解决循环依赖问题,缓存是循环的一个出口。B拿到A的早起对象就可以初始化,从而A就可以注入B属性。

多例@Scope(“”prototype)

属性的注入方式有两种,@Autowired(属性注入的方式),构造函数的方式注入,构造方法中的参数是当前类依赖的另外一个类。

spring解决循环依赖的方法:三级缓存

一级可以解决,多线程环境下,获取不到完整bean问题。

二级缓存也可以解决循环依赖问题,有多重循环依赖下,重复创建代理的问题。

多例可以解决循环依赖么?无法解决,多例没有用到缓存,故无法解决循环依赖。

构造方法注入属性的循环依赖问题怎么解决?在构造方法上使用注解@Lazy。实例化A的时候,创建的是B的代理,创建B的代理的时候,又需要A的实例,此时调用的是A的无参构造方法。在bean实际调用方法的时候,才会创建。

context.getBean(A)>context.getBean(A).getB,此时创建B的代理>context.getBean(A).getB.xxx调用的就是B的方法。

jdk动态代理:被代理的目标类没有实现接口。

cglib动态代理:被代理的目标类实现了接口。

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

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

相关文章

docker (desktopcompose) download

docker docker-compose download 百度网盘获取离线包链接release-notes 参考dockerdocker-composewlspowershell

基于Spring Boot的大创项目成本控制系统

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常…

Linux下ClamAV源代码安装与使用说明

Linux下ClamAV源代码安装与使用说明 ClamAV(Clam AntiVirus)是一款开源的防病毒工具,广泛应用于Linux平台上的网络安全领域。它以其高效的性能和灵活的配置选项,成为网络安全从业人员的重要工具。ClamAV支持多线程扫描,可以自动升级病毒库,并且支持多个操作系统,包括Li…

扫普通链接二维码打开小程序

1. 2.新增规则&#xff08;注意下载文件到跟目录下&#xff0c;需要建个文件夹放下载的校验文件&#xff09; 3.发布 ps&#xff1a;发布后&#xff0c;只能访问正式版本。体验版本如果加了 测试链接http://xxx/xsc/10 那么http://xxx/xsc/aa.....应该都能访问 例如aa101 aa…

5 -《本地部署开源大模型》在Ubuntu 22.04系统下ChatGLM3-6B高效微调实战

在Ubuntu 22.04系统下ChatGLM3-6B高效微调实战 无论是在单机单卡&#xff08;一台机器上只有一块GPU&#xff09;还是单机多卡&#xff08;一台机器上有多块GPU&#xff09;的硬件配置上启动ChatGLM3-6B模型&#xff0c;其前置环境配置和项目文件是相同的。如果大家对配置过程还…

前端excel的实现方案Luckysheet

一、介绍 Luckysheet是一款纯前端类似excel的在线表格&#xff0c;功能强大、配置简单、完全开源的插件。目前已暂停维护&#xff0c;但是其已有功能大概能满足常见需求的使用。 二、引入 ①cdn引入&#xff08;目前应该已经不支持&#xff0c;可自行尝试&#xff09; <l…

第二十七篇:传输层讲解,TCP系列一

一、传输层的功能 ① 分割与重组数据 传输层也要做数据分割&#xff0c;所以必然也需要做数据重组。 ② 按端口号寻址 IP只能定位数据哪台主机&#xff0c;无法判断数据报文应该交给哪个应用&#xff0c;传输层给每个应用都设置了一个编号&#xff0c;这个编号就是端口&…

大数据毕业设计选题推荐-电影数据分析系统-电影推荐系统-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

大模型应用开发:如何在网页中嵌入3D人物

要实现的效果如图所示&#xff1a; 左侧是插入的3D人物&#xff0c;类似AI智能助手的角色。 我们这里是通过React做的。需要用到以下工具或者网站&#xff1a; readyplayer.me/ 自定义3D人物Blender 3维设计软件&#xff0c;3D文件格式转化&#xff0c;主要是fbx和glb的互转w…

【Docker】安装部署项目流程(Pycharm版)

安装部署步骤 1.准备项目 第一步要准备好你所需要部署的项目&#xff0c;确保在工作目录下所以程序.py文件正常调用并能正确运行 如上&#xff0c;main要在工作目录中能跑通&#xff0c;这里有一点需要注意 在IDE src不要标记为源代码根目录&#xff0c;观察一下是否能跑通代…

React国际化中英文切换实现

目录 概况 安装 文件结构 引入 使用 正常使用 传参使用 概况 react-intl-universal 是一个国际化库&#xff0c;专门为 React 应用提供多语言支持。与 React 原生的 react-intl 相比&#xff0c;react-intl-universal 支持从远程服务器加载语言包&#xff0c;动态切换语…

【途牛旅游网-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

RabbitMQ service is already present - only updating service parameters

Windows下卸载RabbitMQ之后,然后重新注册RabbitMQ服务的时候,报错以下信息: D:\software\rabbitmq-server-4.0.2\rabbitmq_server-4.0.2\sbin>D:\software\rabbitmq-server-4.0.2\rabbitmq_server-4.0.2\sbin\rabbitmq-service.bat install RabbitMQ service is already …

智能时代摩托车一键启动无钥匙进入感受科技前线

向智能化与高性能迈进,技术创新与绿色转型引领摩托车行业智能化出行。 摩托车一键启动无钥匙进入功能是一种先进的车辆控制系统&#xff0c;它允许驾驶员在不使用传统机械钥匙的情况下&#xff0c;通过智能感应技术自动解锁和启动摩托车。这种系统通常包括一个智能钥匙&#x…

第二十八篇:TCP协议概述,TCP系列二

传输控制协议&#xff08;Transmission Control Protocol&#xff0c;TCP&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。在 TCP 协议中&#xff0c;通过三次握手建立连接。通信结束后&#xff0c;还需要断开连接。如果在发送数据包时&#xff0c;没有正确…

哪款宠物空气净化器性价比高?希喂、米家和范罗士哪款更好?

这次我真的不是很想抱怨&#xff0c;是我男朋友真的很过分&#xff01;真的很过分&#xff0c;差点让我们两个分道扬镳。先听我说&#xff0c;这不是我和他都嫌家里太安静了吗&#xff0c;每天下班后两个人吃完饭就各玩各的手机&#xff0c;生活太无趣了&#xff0c;加上这几年…

前端开发设计模式——状态模式

目录 一、状态模式的定义和特点 二、状态模式的结构与原理 1.结构&#xff1a; 2.原理&#xff1a; 三、状态模式的实现方式 四、状态模式的使用场景 1.按钮的不同状态&#xff1a; 2.页面加载状态&#xff1a; 3.用户登录状态&#xff1a; 五、状态模式的优点 1.提…

vue+element的confirm提示消息文字变色和换行

效果: 思路: 可以考虑采用模板字符串的思路实现 代码: this.confirm(您确定要<b style"Color: red">${text}</b>的数据项&#xff1f;<br/>单位名称: ${row.companyName} <br/>属性: ${row.attributeName}).then(() > {console.log(确定…

一、定时器的时钟来源

计数器的时钟选择8个时钟源&#xff0c;可以分成4类: 一、来自RCC的内部时钟TIMx CLK 二、芯片内部其他定时器的触发输入ITR 使用某一个定时器作为另外一个定时器的分频 ITR1、ITR2、ITR3和ITR4 三、外部时钟源模式1&#xff1a; 外部捕获引脚上的边沿信号 TI1FP…

趋势(一)利用python绘制折线图

趋势&#xff08;一&#xff09;利用python绘制折线图 折线图&#xff08; Line Chart&#xff09;简介 折线图用于在连续间隔或时间跨度上显示定量数值&#xff0c;最常用来显示趋势和关系&#xff08;与其他折线组合起来&#xff09;。折线图既能直观地显示数量随时间的变化…