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
上一篇 4小时前
下一篇 2小时前

相关推荐

  • 2025年最新DataGrip永久破解教程 | 附激活码&破解补丁下载 🚀

    还在为DataGrip的激活问题发愁吗?🤔 本文将手把手教你如何永久破解DataGrip至2099年!这个方法同样适用于JetBrains全家桶其他IDE,包括IDEA、PyCharm等。 先看破解成果 ✨ 成功破解后,你的DataGrip有效期将延长至2099年!看看这个令人兴奋的截图: 准备工作 🛠️ 1. 下载DataGrip安装包 如果已经安装可以跳…

    DataGrip激活码 2025 年 6 月 27 日
    4200
  • Java Druid 面试题

    Druid连接池在项目中有哪些优势? 性能优越:Druid采用了高效的连接管理机制,可以快速地创建和回收数据库连接,减少了连接的创建和销毁带来的性能开销。 监控与统计:Druid提供了详细的监控信息,包括连接池的状态、SQL执行的统计信息等,这有助于性能调优和问题诊断。 SQL日志记录:Druid内置了SQL执行日志记录功能,可以记录所有SQL语句的执行情况…

    未分类 2025 年 1 月 11 日
    38500
  • MySQL高可用架构:打造数据库的”全天候守护系统”

    MySQL高可用架构:打造数据库的”全天候守护系统” 🌐🛡️ 如同现代化城市离不开持续运转的电力网络和应急响应体系,当代应用系统同样需要具备”零中断”特性的数据库支撑…本文将带您深入MySQL的”高可靠”技术领域,揭秘如何为数据存储构建完善的”不间断运行”机制! 高可用性概念解析 🔍 MySQL高可用性代表着一整套系统设计原则与工程技术,其核心目标是保障…

    2025 年 5 月 12 日
    6500
  • Elasticsearch 8.x 集成与 Java API 使用指南

    目录 背景 版本区别 安装Elasticsearch 8.x服务 启动es服务 安装es管理平台 项目集成 pom.xml文件引入依赖 application.yml配置 ES初始化配置类实现 ES8.x常用API实现 1.判断es索引是否存在 2.删除索引 3.创建索引 4.新增文档 5.更新文档 6.根据id查询文档 7.根据id删除文档 8.查询文档列…

    2024 年 12 月 27 日
    42000
  • 🚀 2025年最新IDEA激活码分享:永久破解IDEA终极教程(附破解补丁)🔥

    💻 教程适用范围 本教程完美适用于JetBrains全家桶,包括但不限于IDEA、PyCharm、DataGrip、Goland等开发工具!✨ 先给大家看看最新版IDEA成功破解的效果图,有效期直达2099年,简直不要太爽!😎 下面我将用详细的图文步骤,手把手教你如何将IDEA激活至2099年。这个方法同样适用于旧版本哦!👍 无论你使用什么操作系统或版本,这…

    2025 年 5 月 15 日
    44900

发表回复

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

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信