Java面试:SSM框架核心技术要点详解(AOP原理阐释、Spring事务运作与失效状况、循环引用解决办法、SpringBoot自动配置原理剖析及常见注解解读)

文章标题:

Java面试:SSM框架核心技术要点深度剖析(AOP原理阐释、Spring事务运作与失效情形、循环引用解决途径、SpringBoot自动配置原理解析及常见注解解读)

文章内容

文章目录

1.0 Spring 框架中的单例 bean 是否线程安全?
2.0 何谓 AOP?
3.0 项目中有无运用 AOP?
4.0 Spring 中事务是怎样实现的?
5.0 Spring 中事务失效的场景有哪些?
6.0 Spring 的 bean 的生命周期是怎样的?
7.0 Spring 中的循环引用是怎么回事?
8.0 能否清晰阐述解决循环依赖问题的流程?
9.0 构造方法出现循环依赖该怎么解决?
10.0 SpringMVC 的执行流程是怎样的?
11.0 Springboot 自动配置原理是怎样的?
12.0 Spring 的常见注解有哪些?
13.0 SpringMVC 常见的注解有哪些?
14.0 Springboot 常见的注解有哪些?
15.0 MyBatis 执行流程是怎样的?
16.0 Mybatis 是否支持延迟加载?
17.0 知晓延迟加载的底层原理吗?
18.0 Mybatis 的一级、二级缓存用过吗?
19.0 Mybatis 的二级缓存何时会清理缓存中的数据?

1.0 Spring 框架中的单例 bean 是否线程安全?

单例 bean 并非线程安全的。当多个用户同时发起请求时,容器会为每个请求分配一个线程,这些线程会并发执行业务逻辑。若处理逻辑中包含对单例状态的修改,例如修改单例的成员属性,就必须考虑线程同步问题。Spring 框架本身不会对单例 bean 进行线程安全封装,线程安全和并发相关问题需要开发者自行处理。

通常项目中使用的 Spring bean 处于不可变状态,比如 Service 类和 DAO 类,从这个层面来讲,Spring 的单例 bean 在一定程度上可视为线程安全的。但要是 bean 存在多种状态,像 ViewModel 对象,就需要自行确保线程安全。最简单的解决办法是将单例 bean 的作用域由 "singleton" 变更为 "prototype"。

2.0 何谓 AOP?

AOP,也就是面向切面编程,在 Spring 中用于把那些与业务无关却会对多个对象产生影响的公共行为和逻辑提取出来,实现公共模块的复用,降低耦合度。常见的应用场景包含公共日志保存以及事务处理。

3.0 项目中有无运用 AOP?

在后台管理系统中运用 AOP 来记录系统操作日志。主要思路是借助 AOP 的环绕通知和切点表达式,找到需要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,例如类信息、方法信息、注解、请求方式等,并将这些参数保存到数据库中。

4.0 Spring 中事务是怎样实现的?

Spring 实现事务的本质是通过 AOP 来达成的。它会对方法的前后进行拦截,在执行方法前开启事务,在执行完目标方法后,依据执行情况提交或回滚事务。

5.0 Spring 中事务失效的场景有哪些?

在项目中,碰到过几种致使事务失效的场景:
- 1)若方法内部捕获并处理了异常,却没有将异常抛出,会致使事务失效。所以,处理异常后应该保证异常能够被抛出。
- 2)若方法抛出检查异常(checked exception),并且没有在 @Transaction 注解上配置 rollbackFor 属性为 Exception,那么异常发生时事务可能不会回滚。
- 3)若事务注解的方法不是公开(public)修饰的,也可能造成事务失效。

6.0 Spring 的 bean 的生命周期是怎样的?

Spring 中 bean 的生命周期包含以下步骤:
1. 通过 BeanDefinition 获取 bean 的定义信息。
2. 调用构造函数实例化 bean。
3. 进行 bean 的依赖注入,例如通过 setter 方法或 @Autowired 注解。
4. 处理实现了 Aware 接口的 bean。
5. 执行 BeanPostPricessor 的前置处理器。
6. 调用初始化方法,如实现了 InitializingBean 接口或自定义的 init - method。
7. 执行 BeanPostProcessor 的后置处理器,可能在这里产生代理对象。
8. 最后销毁 bean。

7.0 Spring 中的循环引用是怎么回事?

循环依赖发生在两个或两个以上的 bean 相互持有对方,形成闭环的情况。Spring 框架允许循环依赖的存在,并通过三级缓存来解决大部分循环依赖问题:
- 一级缓存:单例池,缓存已完成初始化的 bean 对象。
- 二级缓存:缓存尚未完成生命周期的早期 bean 对象。
- 三级缓存:缓存 objectFactory,用于创建 bean 对象。

8.0 能否清晰阐述解决循环依赖问题的流程?

解决循环依赖的流程如下:
1. 实例化 A 对象,并创建 ObjectFactory 存入三级缓存。
2. A 在初始化时需要 B 对象,开始 B 的创建逻辑。
3. B 实例化完成,也创建 ObjectFactory 存入三级缓存。
4. B 需要注入 A,通过三级缓存获取 ObjectFactory 生成 A 对象,存入二级缓存。
5. B 通过二级缓存获取 A 对象后,B 创建成功,存入一级缓存。
6. A 对象初始化时,由于 B 已经创建完成,可以直接注入 B,A 创建成功存入一级缓存。
7. 清除二级缓存中的临时对象 A。

9.0 构造方法出现循环依赖该怎么解决?

因为构造函数是 bean 生命周期中最先执行的,Spring 框架无法解决构造方法的循环依赖问题。可以使用 @Lazy 懒加载注解,延迟 bean 的创建直到实际需要时。

10.0 SpringMVC 的执行流程是怎样的?

SpringMVC 的执行流程包含以下步骤:
1. 用户发送请求到前端控制器 DispatcherServlet。
2. DispatcherServlet 调用 HandlerMapping 找到具体处理器。
3. HandlerMapping 返回处理器对象及拦截器(如果有)给 DispatcherServlet。
4. DispatcherServlet 调用 HandlerAdapter。
5. HandlerAdapter 适配并调用具体处理器(Controller)。
6. Controller 执行并返回 ModelAndView 对象。
7. HandlerAdapter 将 ModelAndView 返回给 DispatcherServlet。
8. DispatcherServlet 传给 ViewResolver 进行视图解析。
9. ViewResolver 返回具体视图给 DispatcherServlet。
10. DispatcherServlet 渲染视图并响应用户。

11.0 Springboot 自动配置原理是怎样的?

Spring Boot 的自动配置原理基于 @SpringBootApplication 注解,它封装了 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan。@EnableAutoConfiguration 是核心,它通过 @Import 导入配置选择器,读取 META - INF/spring.factories 文件中的类名,根据条件注解决定是否将配置类中的 Bean 导入到 Spring 容器中。

12.0 Spring 的常见注解有哪些?

Spring 的常见注解包含:
- 声明 Bean 的注解:@Component、@Service、@Repository、@Controller。
- 依赖注入相关注解:@Autowired、@Qualifier、@Resource。
- 设置作用域的注解:@Scope。
- 配置相关注解:@Configuration、@ComponentScan、@Bean。
- AOP 相关注解:@Aspect、@Before、@After、@Around、@Pointcut。

13.0 SpringMVC 常见的注解有哪些?

SpringMVC 的常见注解有:
- @RequestMapping:映射请求路径。
- @RequestBody:接收 HTTP 请求的 JSON 数据。
- @RequestParam:指定请求参数名称。
- @PathVariable:从请求路径中获取参数。
- @ResponseBody:将 Controller 方法返回的对象转化为 JSON。
- @RequestHeader:获取请求头数据。
- @PostMapping、@GetMapping 等。

14.0 Springboot 常见的注解有哪些?

Spring Boot 的常见注解包含:
- @SpringBootAplication:由 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan 组成。
- 其他注解如 @RestController、@GetMapping、@PostMapping 等,用于简化 Spring MVC 的配置。

15.0 MyBatis 执行流程是怎样的?

MyBatis 的执行流程如下:
1. 读取 MyBatis 配置文件 mybatis - config.xml。
2. 构造会话工厂 SqlSessionFactory。
3. 会话工厂创建 SqlSession 对象。
4. 操作数据库的接口,Executor 执行器。
5. Executor 执行方法中的 MappedStatement 参数。
6. 输入参数映射。
7. 输出结果映射。

16.0 Mybatis 是否支持延迟加载?

Mybatis 支持延迟加载,也就是在需要用到数据时才加载。可以通过配置文件中 lazyLoadingEnabled 配置启用或禁用延迟加载。

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

延迟加载的底层原理主要使用 CGLIB 动态代理实现:
1. 使用 CGLIB 创建目标对象的代理对象。
2. 调用目标方法时,如果发现是 null 值,则执行 SQL 查询。
3. 获取数据后,设置属性值并继续查询目标方法。

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

Mybatis 的一级缓存是基于 PerpetualCache 的 HashMap 本地缓存,作用域为 Session,默认开启。二级缓存需要单独开启,作用域为 Namespace 或 mapper,默认也采用 PerpetualCache,HashMap 存储。

19.0 Mybatis 的二级缓存何时会清理缓存中的数据?

当作用域(一级缓存 Session/ 二级缓存 Namespaces)进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被清空。

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/12810.html

(0)
LomuLomu
上一篇 2025 年 7 月 8 日
下一篇 2025 年 7 月 8 日

相关推荐

  • 【GreatSQL优化器-10】find_best_ref

    【GreatSQL优化器-10】find_best_ref 一、find_best_ref介绍 GreatSQL的优化器对于join的表需要根据行数和cost来确定最后哪张表先执行哪张表后执行,这里面就涉及到预估满足条件的表数据,在keyuse_array数组有值的情况下,会用find_best_ref函数来通过索引进行cost和rows的估计,并且会找出最…

    2025 年 1 月 10 日
    42100
  • 小白实用最新idea激活码和2025破解教程

    声明:下文所有破解补丁与激活码均来自互联网公开渠道,仅供个人学习研究,禁止商业用途。若条件允许,请支持正版!官方正版低至 32 元/年,支持全家桶,直达:https://panghu.hicxy.com/shop/?id=18 废话少说,先上图:IDEA 2025.2.1 已顺利激活至 2099 年,稳得一批! 下面用图文一步步带你搞定最新版 Intelli…

    IDEA破解教程 2025 年 11 月 14 日
    3900
  • 最新datagrip激活码分享渠道附破解资源

    免责声明:下文所述 DataGrip 破解补丁与激活码均源自互联网公开资源,仅供个人学习研究,禁止任何商业用途。若条件允许,请支持正版! 先放一张成果图:DataGrip 2025.2.1 已顺利激活至 2099 年,爽到飞起! 下面用图文一步步演示如何搞定最新版 DataGrip 的激活。 嫌折腾?直接买官方全家桶账号,登录即用,低至 32 元/年:htt…

    2025 年 11 月 4 日
    6800
  • “探索Java List的无限可能:从基础到高级应用“

    Java List 探索之旅 1. List 简介 2. List 接口概览 3. List 实际应用 一:List 的定义在Java的集合框架中,List是一个接口,继承自Collection。它代表了一个有序的元素集合,允许对元素进行增加、删除、修改和查询等操作。 Collection接口定义了一系列集合操作的方法,而Iterable接口则允许我们对集合…

    2024 年 12 月 28 日
    29000
  • Python在多个Excel文件中找出缺失数据行数多的文件

    本文介绍基于Python 语言,针对一个文件夹 下大量的Excel 表格文件,基于其中每一个文件 内、某一列数据 的特征,对其加以筛选,并将符合要求 与不符合要求 的文件分别复制到另外两个新的文件夹 中的方法。 首先,我们来明确一下本文的具体需求。现有一个文件夹,其中有大量的Excel 表格文件(在本文中我们就以csv格式的文件为例);如下图所示。 其中,每…

    2025 年 1 月 13 日
    33300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信