java笔试面试题含答案总结六

本文介绍了Spring事务的7种传播行为,对比了FactoryBean与BeanFactory的区别,详细阐述了Spring Bean的生命周期过程,包括实例化、属性注入、初始化和销毁阶段。同时讨论了循环依赖的解决方案和Spring应用的设计模式,如工厂模式、单例、策略和代理等。

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

1、spring中事务的传播特性

事务传播特性,就是多个事务方法调用时如何定义方法间事务的传播。Spring 定义了 7 种传播行为:

propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是Spring默认的选择。
propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作。

2、FactoryBean 与 BeanFactory 有什么区别?

BeanFactory是个Factory,也就是IOC容器或对象⼯⼚,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进⾏管理的。但对FactoryBean⽽⾔,这个Bean不是简单的Bean,⽽是⼀个能⽣产或者修饰对象⽣成的⼯⼚Bean

BeanFactory 是 IoC 底层容器,提供了 bean 的管理
FactoryBean 是创建 Bean 的一种方式,帮助实现复杂的初始化逻辑

3、介绍一下 Spring bean 的生命周期

1.实例化Bean,反射的方式生成对象

2.填充bena的属性:populateBean(),循环依赖的问题(三级缓存)

3.调用aware接口相关的方法:invokeAwareMethod(完成BeanName可以获取容器bean的名称,BeanFactory获取当前bean factory这也可以调用容器的服务,BeanClassLoader对象的属性设置)

4.调用BeanPostProcessor中的前置处理方法:使用比较多的有(ApplicationContextPostProcessor设置ApplicationContext,Environment,ResourceLoader,EmbeddValueResolver等对象)

5.调用initmethod方法:invokeInitmethod(),判断是否实现了InitializingBean接口,如果有,调用afterPropertiesSet方法,

6.调用BeanPostProcessor的后置处理方法:spring的aop就是在此处实现的,AbstractAutoProxyCreator

​ 注册Destuction相关的回调接口

7.获取到完整的对象,可以通过getBean的方式来进行对象的获取

8.销毁流程 ①判断是否实现了DispoableBean接口②调用destroyMethod方法

Spring bean的生命周期只有四个主要阶段,其他都是在这四个主要阶段前后的扩展点,这四个阶段是:
1.实例化 Instantiation
2.属性赋值 Populate
3.初始化 Initialization
4.销毁 Destruction

4、三级缓存
什么是三级缓存,其实就是Spring中在实例化的时候定义了三个不同的Map,如果我们要解决循环依赖,其核心就是提前拿到提前暴露的对象,尽管它还没有初始化。

一级缓存,用于存放完全初始化好的 Bean
二级缓存,存放提前暴露的Bean,Bean 是不完整的,未完成属性注入和执行初始化方法
三级缓存,单例Bean工厂,二级缓存中存储的就是从这个工厂中获取到的对象

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

A 实例化时依赖 B,于是 A 先放入三级缓存,然后去实例化 B;
B 进行实例化,把自己放到三级缓存中,然后发现又依赖于 A,于是先去查找缓存,但一级二级都没有,在三级缓存中找到了。
然后把三级缓存里面的 A 放到二级缓存,然后删除三级缓存中的 A;
然后 B 注入半成品的实例 A 完成实例化,并放到一级缓存中;
然后回到 A,因为 B 已经实例化完成并存在于一级缓存中,所以直接从一级缓存中拿取,然后注入B,完成实例化,再将自己添加到一级缓存中。

6、Spring 框架用到了哪些设计模式?

工厂模式:Spring 使用工厂模式,通过 BeanFactory 来创建对象

单例模式:Bean 默认就是单例模式

策略模式:Resource 的实现类,针对不同的资源文件,实现了不同方式的资源获取策略

代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码提升

模板方法模式:父类生成代码骨架,具体实现延迟到子类,如 JdbcTemplate、RestTemplate

适配器模式:Spring AOP 中的 Advice 使用到了适配器模式,Spring MVC 中用到了适配器模式适配 Controller

观察者模式:Spring 事件驱动模型就是观察者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值