Spring
Spring框架中的单例bean是什么?
- Spring框架中的单例bean是一种在整个应用程序上下文中只存在一个共享实例的Bean。若在一个容器中定义一个Bean,没有指定的作用域,默认情况下为单例的。
Spring框架中的单例bean是线程安全的吗?
- Spring框架中的单例bean默认情况下是线程安全的。
- 在多线程条件下,Spring容器会负责管理bean的生命周期和线程安全性。当一个线程请求获取一个单例bean时,Spring容器会确保只有一个实例被创建并且该实例会被多个线程共享
- 然而如果单例bean使用了可变状态,可能会导致线程安全问题。最简单的处理方式就是将多态bean的作用由单例(singleton)改为原型(prototype)
什么是AOP?
- AOP是面向切面编程,在Spring中将那些与业务无关,但却对多个对象产生影响的公共行为,抽取公共模块来降低耦合
你项目中有没有用到AOP?
在我第一个项目时,无论是菜品还是套餐进行操作时,都会涉及到更新时间、操作的用户id的记录。可以采用AOP面向切面编程,将这些操作封装起来,在mapper层加上相应的注解即可。具体流程如下:
- 自定义注解类,用于标识需要填充的公共字段的方法
- 自定义切面类。统一拦截添加了注解类注解的方法,实现公共字段填充的赋值逻辑
- 在mapper层加入注解
Spring中的事务是如何实现的?
- Spring中的事务本质是通过AOP实现的。在方法前后进行拦截,在执行方法之前开启事务,执行方法之后根据执行情况进行提交或者回滚事务
Spring中事务失效的场景?
- 未正确配置事务管理器
- 异常被捕获并处理
- 方法未被代理
Spring的bean的生命周期?
- 实例化:Spring会使用Java反射机制来实例化Bean
- 设置属性:容器会注入Bean的属性,包括依赖注入和其他属性注入
- 自定义初始化方法:如果Bean实现了初始化接口或在配置文件中指定了初始化方法,容器会执行自定义初始化逻辑。
- 使用bean:初始化完成后可以被容器和其他bean使用
- 自定义消毁方法:如果bean在配置文件中指定了销毁方法,在容器关闭时会执行这些自定义清理逻辑
- 销毁:释放资源,并将bean实例从容器中移除
Spring中的循环引用?
两个或两个以上的Bean互相持有对方。比如A依赖于B,B依赖于A。目前Spring中通过三级缓存来解决循环引用问题。
- 一级缓存:单例池,缓存已经初始化完成的bean对象
- 二级缓存:缓存早期Bean对象
- 三级缓存:缓存对象工厂(用来创建对象的)
三级缓存解决循环引用的具体流程?
- 假定现在有AB两个对象。先实例A对象,同时创建对象工厂对象存入三级缓存。A在初始化时需要B这时候走B的创建逻辑
- B实例化完成也会创建对象工厂对象存入三级缓存。
- B通过三级缓存中对象工厂来获取A的对象(可能是A的普通对象也可能是A的代理对象),同时放入二级缓存。
- B通过二级缓存获得A的对象后可以正常注入,B创建成功加入一级缓存
- 由于B已经创建成功,可以直接注入B,A创建成功存入一级缓存。然后清楚二级缓存中A的临时对象
构造方法出现了循环依赖怎么解决?
- 可以使用@Lazy懒加载,什么时候需要对象再进行 bean对象的创建
SpringMVC
SpringMVC的执行流程知道吗?
- 客户端向服务端发送HTTP请求,请求到达前端控制器
- 前端控制器接收请求并根据配置找到对应的HandlerMapping
- HandlerMapping负责找到具体的处理器,将处理器返回给前端控制器
- 前端控制器将请求分发给处理器,处理器处理完成后返回ModelAndView对象
- 前端控制器接收ModelAndView后将结果传给视图解析器
- 视图解析器解析完成后返回视图
- 前端控制器将模型数据填充至视图中,返回给用户
SpringBoot
Springboot自动配置原理?
Spring的自动配置是通过@EnableAutoConfiguration注解和spring.factories文件实现的。@EnableAutoConfiguration注解用于启用Spring Boot的自动配置功能,而spring.factories文件则包含了所有自动配置类的全限定名,Spring Boot会在启动时自动扫描并加载这些类。
spring中常见的注解有哪些?
- 声明Bean的:@Component、@Service、@Countroller
- 依赖注入相关的:@Autowired、@Resourse
- 设置作用域:@Scope
- Spring配置相关:@Configuration、@ComponentScan、@Bean
- aop相关做增强的注解 @Aspect、@Before、@After、@Around
SpringMVC常见的注解有哪些?
- @RequestMapping:用于映射请求路径:
- @RequestBody:实现接收http请求的json数据,将json转换为java对 象;
- @RequestParam:指定请求参数的名称;
- @PathViriable:从请求路径下中获取请求参数
- @ResponseBody:注解实现将controller方法返回对象转化为json对象响应给客户端。
- @PostMapping、@GetMapping等
SpringBoot常见注解?
- @SpringBootConfiguration
- @EnableAutoConfiguration
- @ComponentScan
MyBatis
MyBatis的执行流程?
- 加载配置文件:加载配置文件(通常为mybatis-config.xml)。该配置文件包含数据库连接信息、映射文件等信息
- 解析映射文件:在配置文件中会指定使用的映射文件,MyBatis会解析这些映射文件
- 创建会话工厂:通过解析配置信息和映射文件,创建会话工厂
- 创建SqlSession对象:通过会话工厂获取SqlSession对象。SqlSession提供了操作数据库的各种方法
- 执行SQL:通过SqlSession执行SQL语句
- 返回结果
Mybatis是否支持延迟加载?
- 支持的
- 延迟加载是指在需要用到数据时才进行加载,不需要用到数据时就不加载数据。
- Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false,默认是关闭的
延迟加载的底层原理知道吗?
- 当访问一个需要延迟加载的属性时,MyBatis会创建一个动态代理对象来代替原始对象
- 当第一次访问需要进行延迟加载的属性时,动态代理对象会拦截到这个访问,去加载其他数据
- 加载的数据通过反射赋值给延迟加载属性,完成延迟加载的过程
Mybatis的一级、二级缓存用过吗?
- 一级缓存:一级缓存是MyBatis中默认开启的缓存机制,它是基于SqlSession的。
- 原理:当你执行一个查询,MyBatis会将查询结果缓存在SqlSession的上下文中,后续相同的查询如果在同一个SqlSession中执行,就会直接从缓存中获取结果,而不会再次执行SQL查询。
- 二级缓存:二级缓存是基于Mapper级别的缓存机制,它可以跨越多个SqlSession的生命周期
- 原理:当开启二级缓存后,MyBatis会将Mapper执行的查询结果缓存起来,如果相同的查询在不同的SqlSession中执行,且在相同的Mapper中,就会直接从二级缓存中获取结果,而不会再次执行SQL查询。
Mybatis的二级缓存什么时候会清理缓存中的数据?
- 当某一个作用域进行了新增、修 改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。