spring面试题

这篇博客主要探讨了Spring框架中的核心概念和面试常考知识点,包括Bean的创建过程、单例池的概念、@PostConstruct注解的使用、Bean实例化与初始化的区别、构造方法的选择策略、依赖注入的byType和byName原则、@Transactional事务失效的原因及其解决方案,以及Spring如何通过三级缓存解决循环依赖问题。内容深入细致,适合准备Spring面试的开发者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.spring如何创建一个bean对象
类→推断构造方法→普通对象→依赖注入→初始化前(调用@PostConstruct方法)→初始化(initializingbean)→初始化后(AOP)→代理对象→放入map单例池→bean对象
(有aop才会把代理对象装入map 代理对象里面没有依赖注入 没有值 但是会调用普通对象 进去就有值了,没有aop的把普通对象装入map
2 什么是单例池,单例bean
底层用Map<beanName,Bean对象> 多个相同bean是一个实体
多例bean不需要map
3.Bean与pojo区别
区别就是bean经历过依赖注入等
4.@PostConstruct
初始化前(调用方法)用@PostConstruct 反射方法
5.bean实例化与从初始化的区别
实例化是无参构造到对象
初始化是实行实例化的调用initializingbean方法中的afterPropertiesSet
6.bean存在多个构造方法运行哪个
先运行无参构造,如果有写的构造方法 无默认构造方法。
如果有多个有参方法,则报错
可通过@Autowired告诉bean用那个构造方法
7.先bytype 在byname
bean里面传入bean 需要先根据实体类型从map中找到n个类型 再从n个中找到名字一样的。 单例bean可以有多个类型一样的bean 名字不同
8.@Transactional

多个方法都在同一个类中,其中第一个方法中调用了本类中的第二个和第三个方法,这就是自调用。

那么自调用为什么会导致事务失效呢?我们知道Spring中事务的实现是依赖于AOP的,当容器在创建Service这个Bean时,发现这个类中存在了被@Transactional标注的方法(修饰符为public)那么就需要为这个类创建一个代理对象并放入到容器中。由于方法实际上是由Service也就是目标类自己调用的,所以在方法的前后并不会执行事务的相关操作。这也是自调用带来问题的根本原因:自调用时,调用的是目标类中的方法而不是代理类中的方法。

在这里插入图片描述
解决办法 在实体类中注册自己实体类
在这里插入图片描述
9.@configurattion
进入代理模式 调用一个bean

10.spring为什么用三级缓存来解决循环依赖问题

1.单例池 singletonObjects 完整的bean生命周期
2.第二级缓存 earlySingletonOject 判断出现循环依赖以后aop制作出来的不完整生命周期的bean用来填充循环依赖的属性
3.第三级缓存 singletonFactories 用于提前储存普通对象 lambda 以便于aop创造二级缓存 (lambda里面包括aop 和普通bean 就是跳过属性内的全部内容,打破了依赖循环)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cv工程师_java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值