Spring面试题

本文详细解析了Spring中Bean的创建过程,包括构造方法推断、依赖注入、初始化回调等生命周期步骤。同时,针对Spring的循环依赖问题,介绍了三级缓存(singletonObjects、earlySingletonObjects、singletonFactories)如何协同解决,确保Bean的正确实例化。
摘要由CSDN通过智能技术生成

前言

总结一些spring经典面试题


一、Bean创建的生命周期?

类对象 —> 构造方法(构造方法推断) —> 普通对象 —> 依赖注入 —> 初始化前(@PostConstruct)—> 初始化(InitializingBean-》afterPropertiesSet())—> 初始化后(AOP)【创建代理对象,代理对象里面的bean对象指向前面创建的普通对象】—> 放入Map(单例池)—> Bean对象

构造方法推断原理:
1.选择构造方法
最优先使用无参构造器,只有单个有参构造器就使用这个有参构造器,有多个构造器时,有无参构造器就直接使用无参构造器,没有无参构造器直接报错,可以使用@Autowired注解指定使用某个构造器。
2.确定构造方法入参,先byType,再byName;根据类型匹配到唯一个对象直接使用,如有多个对象,再根据名字匹配匹配到唯一个对象即可使用否则报错。


Bean生命周期:

1.调用bean的构造方法创建Bean
2.通过反射调用setter方法进行属性的依赖注入
3.如果Bean实现了BeanNameAware接口,Spring将调用setBeanName(),设置 Bean的name(xml文件中bean标签的id)
4.如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()把bean factory设置给Bean
5.如果Bean实现了ApplicationContextAware接口,Spring容器将调用setApplicationContext()给Bean设置ApplictionContext
6.如果存在BeanPostProcessor,Spring将调用它们的postProcessBeforeInitialization(预初始化)方法,在Bean初始化前对其进行处理
7.如果Bean实现了InitializingBean接口,Spring将调用它的afterPropertiesSet方法,然后调用xml定义的 init-method 方法,两个方法作用类似,都是在初始化 bean 的时候执行
8.如果存在BeanPostProcessor,Spring将调用它们的postProcessAfterInitialization(后初始化)方法,在Bean初始化后对其进行处理
9.Bean初始化完成,供应用使用,直到应用被销毁
10.如果Bean实现了DisposableBean接口,Spring将调用它的destory方法,然后调用在xml中定义的 destory-method方法,这两个方法作用类似,都是在Bean实例销毁前执行

二、Spring循环依赖

2.1 为什么会出现循环依赖?

多个bean之间相互依赖,形成了一个闭环。
实例化某一beanA时,beanA可能会依赖beanB(beanB又依赖beanA)依赖注入beanB,实例化beanB,又需要依赖注入beanA,此时beanA、beanB相互依赖都无法实例化。

2.2 如何去解决循环依赖?

Spring中单例Bean的三级缓存用来解决循环依赖问题。

2.3 一级缓存singletonObjects的作用是什么?

单例池,缓存经过完整bean生命周期的单例bean对象。

2.4 二级缓存earlySingletonObjects的作用是什么?

用来缓存出现循环依赖情况时,提前生成的没有经过完整bean生命周期的一些早期bean对象(属性还未填充完整)。【保证提前生成的代理对象的单例】

2.5 三级缓存singletonFactories的作用是什么?

存放可以生成Bean的工厂,用来打破循环依赖。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不进大厂不改名二号

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

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

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

打赏作者

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

抵扣说明:

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

余额充值