Java面试:框架篇

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的执行流程知道吗?

  1. 客户端向服务端发送HTTP请求,请求到达前端控制器
  2. 前端控制器接收请求并根据配置找到对应的HandlerMapping
  3. HandlerMapping负责找到具体的处理器,将处理器返回给前端控制器
  4. 前端控制器将请求分发给处理器,处理器处理完成后返回ModelAndView对象
  5. 前端控制器接收ModelAndView后将结果传给视图解析器
  6. 视图解析器解析完成后返回视图
  7. 前端控制器将模型数据填充至视图中,返回给用户

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的执行流程?

  1. 加载配置文件:加载配置文件(通常为mybatis-config.xml)。该配置文件包含数据库连接信息、映射文件等信息
  2. 解析映射文件:在配置文件中会指定使用的映射文件,MyBatis会解析这些映射文件
  3. 创建会话工厂:通过解析配置信息和映射文件,创建会话工厂
  4. 创建SqlSession对象:通过会话工厂获取SqlSession对象。SqlSession提供了操作数据库的各种方法
  5. 执行SQL:通过SqlSession执行SQL语句
  6. 返回结果

Mybatis是否支持延迟加载?

  • 支持的
  • 延迟加载是指在需要用到数据时才进行加载,不需要用到数据时就不加载数据。
  • Mybatis配置文件中,可以配置是否启用延迟加载 lazyLoadingEnabled=true|false,默认是关闭的

延迟加载的底层原理知道吗?

  • 当访问一个需要延迟加载的属性时,MyBatis会创建一个动态代理对象来代替原始对象
  • 当第一次访问需要进行延迟加载的属性时,动态代理对象会拦截到这个访问,去加载其他数据
  • 加载的数据通过反射赋值给延迟加载属性,完成延迟加载的过程

Mybatis的一级、二级缓存用过吗?

  • 一级缓存:一级缓存是MyBatis中默认开启的缓存机制,它是基于SqlSession的。
  • 原理:当你执行一个查询,MyBatis会将查询结果缓存在SqlSession的上下文中,后续相同的查询如果在同一个SqlSession中执行,就会直接从缓存中获取结果,而不会再次执行SQL查询。
  • 二级缓存:二级缓存是基于Mapper级别的缓存机制,它可以跨越多个SqlSession的生命周期
  • 原理:当开启二级缓存后,MyBatis会将Mapper执行的查询结果缓存起来,如果相同的查询在不同的SqlSession中执行,且在相同的Mapper中,就会直接从二级缓存中获取结果,而不会再次执行SQL查询。

Mybatis的二级缓存什么时候会清理缓存中的数据?

  • 当某一个作用域进行了新增、修 改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。

  • 21
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值