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)