java面试day3 | 框架篇、Spring、SpringMVC、SpringBoot、MyBatis、注解、AOP、Bean

目录

Spring

单例bean是线程安全的吗?

AOP相关面试题

Spring中事务失效的场景

Sprin-bean

Spring-bean的生命周期

Spring-bean的循环引用

SpringMVC

SpringMVC执行流程

SpringBoot

SpringBoot自动配置原理-最高频

Spring框架常见注解?(Spring,SpringBoot,SpringMVC)

MyBatis

MyBatis执行流程

MyBatis延迟加载使用及原理

MyBatis一级、二级缓存


Spring

单例bean是线程安全的吗?

单例singleton:spring容器只会创建这个bean的一个实例

非单例prototype:每次请求获取bean时,容器都会新创建一个实例

如果不设置的话,默认是单例的

成员变量需要考虑线程安全 ,而id是形式参数,形式参数一般都是局部变量,没有线程安全问题

成员变量:定义在类内部、方法外部的变量,描述类的属性或状态,是类的重要组成部分。它与 "局部变量"(定义在方法内部的变量)相对,两者的作用域、生命周期有显著区别。

维度 Service 类 Dao 类(data access object 数据访问对象)
职责 处理业务逻辑、协调 Dao 操作 仅负责数据 CRUD,无业务逻辑,直接与数据库交互
依赖关系 依赖 Dao 层(可调用多个 Dao) 依赖数据库(或 ORM 框架)
方法设计 按业务场景设计(如register 按数据操作设计(如saveUser
事务控制 通常包含事务注解 不处理事务
复用场景 供 Controller 层调用 供 Service 层调用

由于成员变量需要考虑线程安全,所以尽量不要定义可修改的成员变量

AOP相关面试题

Spring中事务失效的场景

这样配置之后,所有抛出的异常都会导致事务回滚。

非检查异常(Unchecked Exception) 是指编译器不强制要求 开发者显式处理(捕获或声明抛出)的异常,它属于 RuntimeException 及其子类,同时也包括 Error 及其子类(虽然 Error 通常不被视为 "异常",但从编译器检查规则上属于非检查范畴)。

Sprin-bean

Spring-bean的生命周期

BeanPostProcessor#before(后置处理器):用于增强bean,在初始化方法之前进行调用

BeanPostProcessor#after:在初始化方法之后进行调用

@PreDestroy用于关闭容器时销毁bean

Spring-bean的循环引用

上面的二级缓存可以解决一般的循环依赖问题

但如果A是代理对象,现在的二级缓存无法解决问题

补充:代理对象

代理对象是一种替代真实对象(目标对象)的对象,它与目标对象实现相同的接口或者继承相同的抽象类。客户端在使用时,通常不会直接访问目标对象,而是访问代理对象。代理对象会根据实际需求决定是将请求转发给目标对象,还是在转发请求前后执行一些额外的操作。

常见类型:

静态代理:在编译期就确定代理类,代理类和目标类实现相同的接口,代理类中持有目标类的引用。通过代理类可以在调用目标方法前后添加额外的逻辑。

动态代理:在运行期动态生成代理类。在 Java 中,主要有 JDK 动态代理和 CGLIB 动态代理。

  • JDK 动态代理 :要求目标对象实现一个或多个接口,通过 java.lang.reflect.Proxy 类和 InvocationHandler 接口来实现。
  • CGLIB 动态代理:可以在目标对象没有实现接口的情况下创建代理类,它通过继承目标类来实现代理功能。需要引入 CGLIB 的相关依赖

三级缓存可以解决初始化过程中产生的循环依赖,不能解决 构造函数 产生的循环依赖

解决:加注解@Lazy,需要的时候再创建

通过工厂生成的对象统一都放在二级缓存,使用的时候直接拿出来

SpringMVC

SpringMVC执行流程

SpringBoot

SpringBoot自动配置原理-最高频

springboot自动配置:Spring Boot 会根据你添加的依赖和配置,自动帮你完成很多繁琐的框架配置工作。

只需在 pom.xml 中添加 spring-boot-starter-web 依赖,启动类上标注 @SpringBootApplication,运行 main 方法,Web 应用就直接能跑起来 ------Spring Boot 会自动配置好 Tomcat 服务器、DispatcherServlet、JSON 解析器等所有 Web 开发需要的组件。

Spring框架常见注解?(Spring,SpringBoot,SpringMVC)

MyBatis

MyBatis执行流程

配置文件

MyBatis延迟加载使用及原理

fetchType =" lazy" 开启延迟加载,是局部的

全局配置延迟加载:mybatis-config.xml

MyBatis一级、二级缓存

只执行一次查询,第一次的结果放到缓存中(两个使用同一个sqlsession)

相关推荐
MZZDX19 分钟前
MySQL相关知识总结
数据库·mysql
摇滚侠2 小时前
Spring Boot 3零基础教程,创建第一个 Spring Boot 3 应用,Spring Boot 3 外部配置,笔记03
java·spring boot·笔记
disanleya2 小时前
MySQL默认端口为何是3306?修改后如何管理?
数据库·mysql·adb
没有bug.的程序员5 小时前
服务网格 Service Mesh:微服务通信的终极进化
java·分布式·微服务·云原生·service_mesh
川石课堂软件测试5 小时前
MySQL数据库之DBA命令
数据库·网络协议·mysql·http·单元测试·prometheus·dba
uzong6 小时前
一次慢接口背后,竟藏着40+种可能!你中过几个
后端·面试·程序员
ybb_ymm7 小时前
mysql8在linux下的默认规则修改
linux·运维·数据库·mysql
南尘NCA86668 小时前
企业微信防封防投诉拦截系统:从痛点解决到技术实现
java·网络·企业微信
倔强青铜三8 小时前
苦练Python第66天:文件操作终极武器!shutil模块完全指南
人工智能·python·面试