news 2026/5/30 14:56:19

SSM拷打第二讲!!!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SSM拷打第二讲!!!

7. Spring中的循环引用?

是什么->能解决的是什么->三级缓存

Spring 的循环依赖就是 Bean 之间互相依赖,比如 A 依赖 B,B 又依赖 A。

Spring 能解决的主要是单例 Bean 的属性注入循环依赖。它的核心思路是:A 实例化之后,还没完成属性填充和初始化,就先把 A 的早期引用暴露出来;这时 B 创建时需要 A,就可以先拿到这个早期引用,等 B 创建完再回头完成 A 的注入。

三级缓存里,一级缓存放完整 Bean,二级缓存放早期 Bean,三级缓存放ObjectFactory。三级缓存的意义主要是为了在有 AOP 的情况下,能提前拿到代理对象,避免注入原始对象。

但构造器循环依赖和原型 Bean 循环依赖解决不了,因为它们没法像单例属性注入那样提前暴露引用。

8. 那具体解决流程清楚吗?

Spring 解决单例属性注入循环依赖,大概流程可以用 A、B 互相依赖来理解。

创建 A 的时候,Spring 会先把 A 实例化出来,但这时 A 还没有完成属性注入和初始化。为了避免后面别人依赖 A 时拿不到对象,Spring 会把一个能获取 A 早期引用的ObjectFactory放到第三级缓存里。

接着 A 做属性填充,发现需要 B,就去创建 B。B 也会先实例化,并且提前暴露。然后 B 属性填充时发现需要 A,这时候 Spring 会从 A 的第三级缓存里拿到ObjectFactory,通过它拿到 A 的早期引用,放到二级缓存,并注入给 B。

B 完成初始化后进入一级缓存。然后回到 A,A 就可以注入已经创建好的 B,最后 A 也完成初始化,进入一级缓存,同时清理之前的早期引用缓存。

这里要注意,ObjectFactory不是重新创建 A,而是返回 A 的早期引用;如果 A 需要 AOP,它返回的可能就是代理对象。

9. 构造方法出现了循环依赖怎么解决?

构造器循环依赖 Spring 默认是解决不了的。比如 A 的构造方法需要 B,B 的构造方法又需要 A,这时候 A 和 B 都还没实例化完成,Spring 没有任何一个早期对象可以提前暴露,所以三级缓存也救不了。

解决上,我一般不会优先想着硬绕过去,而是先看是不是设计有问题,比如把互相依赖的逻辑抽到第三个服务里,或者重新拆分职责。如果只是技术上要临时打破这个循环,可以用@Lazy,让其中一个依赖注入懒加载代理对象;也可以改成 Setter 或字段注入,让对象先实例化出来,再做属性填充。但从设计上看,构造器循环依赖通常是不太好的信号。

10. SpringMVC的执行流程?

SpringMVC = Java 后端接收请求、调用 Controller、返回响应的框架。
SpringMVC 的核心入口是DispatcherServlet。请求进来后,先由DispatcherServlet接收,然后通过HandlerMapping找到对应的 Controller 方法,同时拿到相关拦截器。

接着DispatcherServlet会交给HandlerAdapter去真正调用 Controller。在这个过程中,SpringMVC 会完成参数解析、数据绑定、类型转换这些工作。Controller 执行完之后会返回结果。

如果是传统页面请求,返回的可能是ModelAndView,然后通过ViewResolver解析视图,最后渲染页面返回给浏览器。
如果是现在常见的 REST 接口,比如@RestController,一般不会走视图解析,而是通过HttpMessageConverter把返回对象转成 JSON,再写回响应体。

11. Springboot自动配置原理

Spring Boot 自动配置的入口一般是@SpringBootApplication,它里面包含了@EnableAutoConfiguration,这个是自动配置的核心。

@EnableAutoConfiguration会通过@Import导入AutoConfigurationImportSelector,然后去加载自动配置类清单。老版本主要是从META-INF/spring.factories里读,Spring Boot 3 之后主要是从AutoConfiguration.imports里读。

这些自动配置类不会无脑生效,而是会配合很多条件注解判断,比如 classpath 里有没有某个类、用户有没有自己定义 Bean、配置文件里有没有开启某个属性。只有条件满足时,Spring Boot 才会把对应的 Bean 注册到容器里。

12. Spring 的常见注解有哪些?

Spring 常见注解我一般按使用场景来分。

第一类是 Bean 注册,比如@Component,以及它的语义化扩展@Service@Repository@Controller
第二类是依赖注入,比如@Autowired@Resource@Qualifier
第三类是配置相关,比如@Configuration@Bean@ComponentScan
第四类是 Web 开发里常用的,比如@RestController@RequestMapping@GetMapping@PostMapping@RequestBody@ResponseBody。还有事务相关的@Transactional,AOP 相关的@Aspect@Around@Pointcut

如果是 Spring Boot 项目,还会常用@SpringBootApplication,它是启动类上的复合注解。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/30 14:52:22

嵌入式开发中库文件构建优化与Keil MDK实践

1. 库文件构建的核心问题解析在嵌入式开发领域,库文件(.lib)的创建和使用是提高代码复用率的关键技术手段。许多开发者在使用Keil MDK等工具链时,会遇到一个典型问题:明明只调用了库中的某个函数,最终生成的二进制文件却包含了整个…

作者头像 李华
网站建设 2026/5/30 14:51:58

Windows 10 PL-2303串口驱动修复指南:让老旧设备重获新生

Windows 10 PL-2303串口驱动修复指南:让老旧设备重获新生 【免费下载链接】pl2303-win10 Windows 10 driver for end-of-life PL-2303 chipsets. 项目地址: https://gitcode.com/gh_mirrors/pl/pl2303-win10 你是否还在为Windows 10系统下PL-2303串口设备只能…

作者头像 李华
网站建设 2026/5/30 14:49:13

仓储数字孪生,如何从“锦上添花”变为“雪中送炭”

很多企业的智慧仓储数字孪生项目,最终沦为了接待领导和客户参观的“面子工程”。数据是滞后的,交互是预设的,无法解决任何实际问题。当业务部门询问“这个系统能帮我降低多少库存成本?能减少多少拣选损耗?”时&#xf…

作者头像 李华
网站建设 2026/5/30 14:47:19

PS4存档管理终极解决方案:Apollo Save Tool完整使用指南

PS4存档管理终极解决方案:Apollo Save Tool完整使用指南 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 你是否曾经因为PS4游戏存档损坏而痛失上百小时的游戏进度?或者想体验其他玩…

作者头像 李华
网站建设 2026/5/30 14:46:07

3大技术突破:PyBaMM热管理精度提升实战指南

3大技术突破:PyBaMM热管理精度提升实战指南 【免费下载链接】PyBaMM Fast and flexible physics-based battery models in Python 项目地址: https://gitcode.com/gh_mirrors/py/PyBaMM 在电池电化学仿真领域,热管理预测的精度直接影响电池系统安…

作者头像 李华