复盘女朋友面试4个月的Spring面试题

简介: 该文章复盘了关于 Spring 的面试题,包括 Spring 的好处、Bean 的生命周期、Spring 循环依赖的解决方法、AOP 的原理以及 Spring Boot 自动装配的原理等,强调对 Spring 核心原理的清晰理解对于回答面试题的重要性。

继续,第四波女朋友面试4个月的面试题复盘,这次是关于Spring的题目。

Spring是Java web开发接触最多的一个框架,基本上每天都会打交道。

直接上题目。Spring框架虽然有很多组件,但是面试题目还是比较少的,因为他的核心思想比较集中。还是老套路,高频的面试题已经标星,有面试需要的同学可以先点星星收藏起来。

image.png

Spring的源码非常深,Spring框架使用了各种设计模式,因此阅读Spring的源码比一些国产框架源码会吃力一些,但是这也阻挡不了我们了解Spring的原理之路,只要我们平时对Spring的原理有一定了解,我们也可以讲清楚常见的面试题目。

image.png

下面开始进入面试题的复盘。

对Spring的思考

  • Spring的好处

这种开放性问题,没有标准的答案,我们不要等面试官问完就回答,我们可以先思考2秒,脑袋里将Spring进行总结一下。我们按照金字塔原理的方式回答,记住一定要先说重点。

1、Spring通过Ioc和Di技术为Bean提供了生命周期管理能力,帮助程序员创建bean和管理bean的关系

2、Spring提供了面向切面编程Aop的编程方式,可以帮助程序员快速集成通用的非业务功能,比如内置的事务功能就是通过aop实现的。

3、Spring框架提供了非常多的扩展点,帮助程序员快速开发和集成第三方组件,比如bean的处理器BeanPostProcessor,全局异常处理ControllerAdvice切面等。

有些面试官可能会根据你说的发散的问,所以你回答的点最好都是自己比较熟悉的点。

Ioc模块面试题

  • 说说Bean的生命周期

如果了解Spring创建Bean的过程,那么这个题目回答起来就没问题。

先说核心重点

image.png

再详细说明

首先bean的出生就是Spring先拿到bean的配方BeanDefinition信息,然后通过反射技术实例化一个bean对象出来。

这个时候bean只是创建了实例,他的属性都是默认值,没有进行用户定制化的属性填充,所以第二步是属性填充。

属性填充之后,Spring为了给用户一些定制化bean的机会,给每个bean留下了一些初始化的接口。

  1. aware后缀接口,感知Spring框架bean的能力

  2. bean的后置处理器,初始化前回调函数 org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization

  3. invokeInitMethods 初始化方法回调

InitializingBean.afterPropertiesSet

invokeCustomInitMethod 包含:PostConstruct注解

  1. bean的后置处理器,初始化后回调函数org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization

初始化完成之后Bean就可以被业务程序使用了,直到程序销毁的时候,bean也会随之销毁。

  • Spring循环依赖的解决方法

Spring解决循环依赖使用到了三个map作为三级缓存,分别存储不同状态的bean。

    /** 一级缓存 存储可以直接使用的bean **/
    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>(256);

    /** 二级缓存 存储bean工厂 可以延迟调用实例化 使用的时候才调用工厂方法获取对象 */ 
    private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<>(16);

    /** 存储不完整对象 不能直接用的 循环依赖时,某些依赖的属性没有设置,这个时候bean就是不完整对象 */ 
    private final Map<String, Object> earlySingletonObjects = new HashMap<>(16);

总结一下,为什么使用三级缓存?

1、singletonObjects这个缓存是存储完整的对象,可以直接使用的。

2、singletonFactories这个缓存是为了延迟初始化,是解决循环依赖的关键,存在循环依赖注入时,可能注入的对象需要被代理,这个工厂类来延迟实例化一个代理类。

3、earlySingletonObjects这个缓存是为了在A注入B,而B又注入A这个阶段,A是一个半成品,需要用来存储A这种半成品bean的状态。需要等待A将B注入之后,这个缓存就要移除。

4、singletonFactories和earlySingletonObjects都是存储对象的中间状态,依赖它们保证最终注入的对象是完整的,依赖注入完成后会被清除。

aop模块

  • 说说aop的原理

Spring aop是对动态代理技术的封装组件,帮助开发人员使用aop实现可插拔的切面功能。

我们可以分三个阶段和面试官说明。

第一阶段 解析程序中定义的切面

这个阶段是解析aop注解或者标签的过程,比如Aspect标识的类,解析得到aop定义的基础beanAspectJPointcutAdvisor,Advice

第二阶段 查找方法的切面和通知,构建通知

对于需要被切面拦截的bean,在bean实例化之后,开始判断是否要创建代理对象,通过jdk或者cglib,同时构建了通知链数组,并缓存起来。

使用方法对象和方法hashCode作为key


private final Method method;

private final int hashCode;

第三阶段 调用通知链路,执行切面的逻辑。

如果是jdk动态代理调用目标方法会触发

org.springframework.aop.framework.JdkDynamicAopProxy#invoke方法

如果是cglib,调用目标方法会触发CglibAopProxy中

org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor#intercept方法

Spring boot模块面试题

  • 自动装配的原理

其实自动装配是Springboot借助Spring提供导入bean到Spring容器的一些机制来实现的。

Spring提供了@Import,ImportSelector,DeferredImportSelector, ImportBeanDefinitionRegistrar等方式导入bean到Spring容器中,

同时利用spring spi技术,查找配置在spring.factories文件里的自动配置类,这样我们只要按照SpringBoot定义规范编写需要自动装配的类就可以实现自动装配了。

总结

Spring和Springboot的题目想回答的时候更加有自信心,对于ioc,aop以及他们的扩展点的原理一定要比较清晰,Spring其他能力都是在这两个核心能力上构建的。

image.png

相关文章
|
28天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
2月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
95 0
|
4月前
|
监控 Java 应用服务中间件
Spring Boot 源码面试知识点
【5月更文挑战第12天】Spring Boot 是一个强大且广泛使用的框架,旨在简化 Spring 应用程序的开发过程。深入了解 Spring Boot 的源码,有助于开发者更好地使用和定制这个框架。以下是一些关键的知识点:
78 6
|
29天前
|
存储 缓存 Java
面试问Spring循环依赖?今天通过代码调试让你记住
该文章讨论了Spring框架中循环依赖的概念,并通过代码示例帮助读者理解这一概念。
面试问Spring循环依赖?今天通过代码调试让你记住
|
27天前
|
存储 缓存 网络协议
复盘女朋友面试4个月的Java基础题
这篇文章是关于Java基础面试题的复盘,涵盖了HashMap原理、对象序列化作用等高频面试问题,并强调了Java基础知识的重要性。
复盘女朋友面试4个月的Java基础题
|
27天前
|
SQL 存储 关系型数据库
复盘女朋友面试4个月的Mysql面试题(1万字)
该文章详细分析了Ribbon的超时配置是否会覆盖OpenFeign的超时配置,并探讨了OpenFeign超时配置能否动态实时修改生效的问题。
复盘女朋友面试4个月的Mysql面试题(1万字)
|
26天前
|
消息中间件 缓存 负载均衡
复盘女朋友面试4个月的RocketMQ面试题
这篇文章复盘了面试中关于RocketMQ的高频题目,包括架构组成、使用姿势、功能原理及高级特性,并强调了理解这些实现机制对于面试成功的重要性。
复盘女朋友面试4个月的RocketMQ面试题
|
27天前
|
消息中间件 Java 中间件
复盘女朋友面试4个月的并发面试题
该文章主要复盘了关于并发的面试题,包括线程池的使用场景、原理、参数合理化设置,以及ThreadLocal、volatile、synchronized关键字的使用场景和原理,还介绍了juc并发工具包中aqs的原理,强调在面试中要将自己理解的点与面试官讲透。
复盘女朋友面试4个月的并发面试题
|
28天前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
3月前
|
XML 缓存 Java
大厂面试攻略:Spring框架核心要点精讲
Java SPI (Service Provider Interface) 是一种服务发现机制,允许在运行时动态加载和发现服务提供者。在数据库驱动加载中,SPI使得数据库驱动能够自动识别和注册,而无需显式加载。 Spring 是一个广泛应用的轻量级框架,核心功能包括依赖注入(DI)和面向切面编程(AOP)。不使用Spring时,开发人员需要手动管理对象的创建和依赖关系,使用Servlet等基础组件完成Web开发,以及手动处理JDBC操作。Spring通过管理Bean的生命周期和依赖关系,简化了企业级应用的开发,降低了代码的侵入性。
50 1
大厂面试攻略:Spring框架核心要点精讲