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)

相关推荐
月阳羊3 小时前
【硬件-笔试面试题-103】硬件/电子工程师,笔试面试题(知识点:项目当中无人机的控制是怎么实现的)
面试·职场和发展
Li zlun3 小时前
Kubernetes 进阶实战:CRD、Gateway API 与优先级调度
java·kubernetes·gateway
七夜zippoe3 小时前
Java 生态监控体系实战:Prometheus+Grafana+SkyWalking 整合全指南(二)
java·grafana·prometheus
没事学AI3 小时前
Caffeine三种缓存过期策略总结:原理、实战与调优
java·缓存·caffeine·缓存穿透防护·caffeine缓存
Micro麦可乐3 小时前
为什么两个看似相等的 Integer 却不相等?一次诡异的缓存折扣商品 BUG 排查
java·缓存·bug·包装类判断·integer判断
杨杨杨大侠4 小时前
手把手教你写 httpclient 框架(七)- 异步处理与性能优化
java·http·github
绝无仅有4 小时前
redis面试史上最全的笔记整理总结
后端·面试·github
ajassi20004 小时前
开源 java android app 开发(十四)自定义绘图控件--波形图
android·java·开源
一叶飘零_sweeeet4 小时前
从 0 到 1 精通 SkyWalking:分布式系统的 “透视镜“ 技术全解析
java·skywalking