一、Spring框架面试:
面试重点 :本次课程挑选Spring相关框架(Spring、Spring MVC、Spring Boot)及MyBatis的较难且高频面试问题讲解。
Spring框架 :讲解bean的线程安全、AOP相关(事务原理、失效场景)、bean的生命周期、循环依赖问题及解决方案。
Spring MVC :讲解其执行流程。
Spring Boot :讲解自动配置原理,梳理常见注解。
MyBatis :讲解执行流程、延迟加载及实现原理、一二级缓存。
二、Spring单例bean线程安全问题:
单例判断 :Spring的bean默认是单例的,可通过@Scope
注解设置,不设置默认是Singleton
,设置为prototype
是多例。
是否安全 :Spring单例bean不是线程安全的,但一般注入无状态对象(成员变量不可修改)无线程安全问题,若定义可修改成员变量则需考虑。
解决方案 :可使用多例或加锁解决线程安全问题。
AOP相关问题 :
AOP概念 :面向切面编程,将与业务无关但影响多对象的公共行为和逻辑抽取封装为可重用模块(切面),减少重复代码,降低耦合度,提高可维护性。
使用场景 :常见场景有记录操作日志、缓存处理、事务处理。
记录日志示例 :以记录操作日志为例,使用AOP环绕通知和切点表达式,找到加了自定义@Log
注解的方法进行增强,获取请求信息并保存到数据库。
事务实现 :Spring事务有编程式和声明式两种,常用声明式,本质通过AOP拦截,在目标方法前后开启、提交或回滚事务。
三、Spring事务失效场景:
异常捕获处理 :在有@Transactional
注解的方法中使用try-catch
捕获处理异常,会使事务通知无法感知异常,导致事务失效,解决方法是抛出异常。
抛出检查异常 :Spring默认只回滚非检查异常(Runtime异常),抛出检查异常会导致事务失效,可在@Transactional
注解中设置rollbackFor
指定异常类型。
非public方法 :Spring为方法创建代理添加事务通知的前提是方法为public
,非public
方法会导致事务失效,解决方法是将方法改为public
。
四、Spring bean的生命周期:
定义信息 :Spring容器实例化时将XML标签或注解信息封装成BeanDefinition
对象,包含类名、初始化方法名、属性值、作用域等信息。
生命周期步骤 :包括调用构造函数实例化对象、依赖注入、实现Aware
接口(可获取bean名称、工厂、上下文等信息)、前置BeanPostProcessor
、执行初始化方法(实现InitializingBean
接口或自定义初始化方法)、后置BeanPostProcessor
,容器关闭时执行销毁方法(加@PreDestroy
注解)。
代码演示 :通过代码演示了user类的生命周期各步骤,可使用后置处理器结合AOP(CGLIB动态代理)对bean进行增强。 已帮你记录好《Spring面试题讨论》,详细内容请点击下方查看: Spring面试题讨论 会议讨论了Spring框架中循环引用、Spring MVC执行流程、Spring Boot自动配置原理以及三个框架常见注解等面试题,具体如下:
五、Spring循环引用问题:
循环引用定义 :两个或以上Bean互相持有对方形成闭环,如A依赖B,B依赖A,也可能是A依赖B,B依赖C,C依赖A或A依赖自身,可能导致死循环。
死循环产生过程 :实例化A为半成品,初始化A需注入B,B不存在则实例化B为半成品,初始化B需注入A,但A未创建完成,又去实例化A,形成死循环。
三级缓存解决 :一级缓存Singleton objects为单例池,存完整生命周期的单例对象;二级缓存early Singleton OBJECTS存早期Bean对象;三级缓存Singleton factories存对象工厂。一级缓存不能解决循环依赖,一级和二级缓存可解决一般对象循环依赖,三级缓存可解决代理对象循环依赖。
构造方法注入问题 :构造方法注入产生的循环引用,三级缓存无法解决,可使用@Lazy注解延迟加载解决。
六、Spring MVC执行流程:
视图阶段流程 :用户请求到DispatcherServlet,其调用Handler Mapping找具体处理器,若有拦截器一起返回;再调用Handler Adapter执行处理器,处理参数和返回值;Handler执行完返回ModelAndView给Handler Adapter,再返回给DispatcherServlet,其找View Resolver将逻辑视图转化为真正视图,最终渲染响应给用户。
前后端分离流程 :前几步与视图阶段相同,方法上加@ResponseBody注解,通过HTTP message convert将返回值转成JSON响应给前端,无需视图和返回ModelAndView。
七、Spring Boot自动配置原理:
核心注解 :引导类上的@SpringBootApplication
包含@SpringBootConfiguration
(声明配置类)、@EnableAutoConfiguration
(自动化配置核心注解)、@ComponentScan
(扫描包)。
配置加载 :@EnableAutoConfiguration
中的@Import
会加载classpath路径下META - INF/spring.factories文件中的自动配置类,约100多个,但并非全部加载,引入对应起步依赖才加载。
条件判断 :通过@ConditionalOnClass
判断是否有对应字节码文件,有则加载配置类;@ConditionalOnMissingBean
判断容器中是否已有对应对象,没有才创建。
八、Spring相关常见注解:
Spring注解 :@Component
及其衍生的@Controller
、@Service
、@Repository
用于实例化Bean;@Autowired
默认按类型注入,@Qualifier
按名称注入;@Scope
设置作用范围;@Configuration
声明配置类;@ComponentScan扫描包;@Bean
将方法返回值放入容器;@Import
导入类;AOP相关注解有@Aspect、@Before、@After、@Around、@Pointcut
。
Spring MVC注解 :@RequestMapping
及其衍生注解用于映射请求路径;@RequestBody
将JSON转Java对象;@RequestParam指定参数名称;@PathVariable
用于路径传参;@ResponseBody
将返回值转JSON响应;@RequestHeader
接收请求头数据;@RestController
包含@Controller
和@ResponseBody
。
Spring Boot注解 :重点是@SpringBootConfiguration
、@EnableAutoConfiguration
、@ComponentScan
,还可提及@SpringBootApplication
。
点赞
打赏