Java 面试篇-SSM 框架专题(什么是 AOP?Spring 中事务时如何实现的?事务失效的场景?Spring 中循环引用怎么解决?Springboot 的自动配置原理?Spring 常见注解?)

Java 面试篇-SSM 框架专题(什么是 AOP?Spring 中事务时如何实现的?事务失效的场景?Spring 中循环引用怎么解决?Springboot 的自动配置原理?Spring 常见注解?)
🔥博客主页: 【小扳_-ZEEKLOG博客】
❤感谢大家点赞👍收藏⭐评论✍

文章目录

        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 是线程安全的吗?

        不是线程安全的。当多用户同时请求一个服务时,容器会给每个请求分配一个线程,这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改,比如修改单例的成员属性,就必须考虑线程同步问题。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 框架允许循环依赖存在,并通过三级缓存解决大部分循环依赖问题:

        1)一级缓存:单例池,缓存已完成初始化的 bean 对象。

        2)二级缓存:缓存尚未完成生命周期的早期 bean 对象。

        3)三级缓存:缓存 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 的常见注解包括:

        1)声明 Bean 的注解:@Component、@Service、@Repository、@Controller。

        2)依赖注入相关注解:@Autowired、@Qualifier、@Resource。

        3)设置作用域的注解:@Scope。

        4)配置相关注解:@Configuration、@ComponentScan、@Bean。

        5)AOP 相关注解:@Aspect、@Before、@After、@Around、@Pointcut。

        13.0 SpringMVC 常见的注解有哪些?

        SpringMVC 的常见注解有:

        1)@RequestMapping:映射请求路径。

        2)@RequestBody:接收 HTTP 请求的 JSON 数据。

        3)@RequestParam:指定请求参数名称。

        4)@PathVariable:从请求路径中获取参数。

        5)@ResponseBody:将 Controller 方法返回的对象转化为 JSON。

        6)@RequestHeader:获取请求头数据。

        7)@PostMapping、@GetMapping 等。

        14.0 Springboot 常见注解有哪些?

        Spring Boot 的常见注解包括:

        1)@SpringBootAplication:由 @SpringBootConfiguration、@EnableAutoConfiguration 和 @ComponentScan 组成。

        2)其他注解如 @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 中的缓存将被清空。

        希望我的文章可以帮助到您,如果需要了解更多内容,请关注:SpringBootWeb 篇_小扳的博客-ZEEKLOG博客

Read more

图形化界面MySQL(MySQL)(超级详细)

目录 1.官网地址 1.1在Linux直接点击NO thanks…? 1.2任何远端登录,再把jj数据库给授权 1.3建立新用户 优点和好处 示例代码(MySQL Workbench) 示例代码(phpMyAdmin) 总结 图形化界面 MySQL 工具大全及其功能分析 一、引言 二、常见的 MySQL 图形化界面工具 1.?MySQL Workbench 2.?phpMyAdmin 3.?DBeaver 4.?Navicat for MySQL 5.?HeidiSQL 三、图形化界面 MySQL 工具的优缺点对比 四、如何选择合适的图形化 MySQL 工具 五、扩展与未来趋势

By Ne0inhk
Spring AI宣布支持Agent Skills,Java开发者的福音

Spring AI宣布支持Agent Skills,Java开发者的福音

Agent Skills是一种模块化能力,以包含YAML前置元数据的Markdown文件形式打包。每个技能都是一个文件夹,其中包含一个SKILL.md文件,该文件包含元数据(至少包括名称和描述)以及指导AI Agent如何执行特定任务的说明。 Agent Skills(AI Agent技能)正在成为构建智能应用的新范式。它将AI能力模块化为可发现、可加载的资源包,让开发者不再需要为每个任务硬编码知识或创建专用工具。 Spring A正式I将这一设计模式引入Java生态系统,并实现了跨LLM的可移植性——你只需定义一次技能,就能在OpenAI、Anthropic、Google Gemini等任何支持的模型上使用。 这是Spring AI Agentic Patterns系列的第一篇文章。本系列将深入探讨spring-ai-agent-utils工具包,一套受Claude Code启发的完整Agent模式集合。 我们将依次介绍Agent Skills(本文)、任务管理、AskUserQuestion交互式工作流,以及用于复杂多Agent系统的分层子Agent。 什么是Agent

By Ne0inhk
KWDB 运维实战:拒绝数据孤岛!用 SQL 打通 Metrics 与 CMDB 的“任督二脉”

KWDB 运维实战:拒绝数据孤岛!用 SQL 打通 Metrics 与 CMDB 的“任督二脉”

在互联网大厂,服务器监控(AIOps)是基础设施的命脉。一旦核心数据库或网关宕机,每分钟的损失可能高达数百万。 传统的监控方案(如 Zabbix、Prometheus)在面对海量指标时各有痛点:Zabbix 擅长告警但历史数据存储能力弱;Prometheus 查询语言(PromQL)学习曲线陡峭且不易与业务数据(如 CMDB)进行关联分析。 运维人员真正需要的是:既能像 Prometheus 一样吞吐海量时序数据,又能像 MySQL 一样用标准 SQL 进行复杂关联查询。 本文将带你体验如何用 KWDB 3.1.0 搭建一个轻量级但高性能的 服务器监控系统,用一个数据库搞定“指标存储”与“资产管理”。 * 场景设定: 监控 500 台服务器的 CPU、内存、磁盘 IO 和网络流量。 * 核心挑战:

By Ne0inhk
Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南

Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 如果你的后端使用 Node.js,那么你大概率在使用 Socket.IO。 Socket.IO 不仅仅是 WebSocket,它是一套极其强大的实时通信框架,内置了长轮询回退、自动重连、房间(Room)、命名空间(Namespace)以及二进制流支持。 socket_io_client 是官方移植到 Dart 的客户端库,完全兼容 JS 版 Socket.IO 的协议。 对于 OpenHarmony 开发者,如果你的业务需要与现有的 Node.js 实时服务(如客服系统、实时游戏服务器)对接,使用这个库可以帮你省去大量解析底层协议的麻烦。 一、核心原理 Socket.

By Ne0inhk