
7. Spring中的循环引用是什么-能解决的是什么-三级缓存Spring 的循环依赖就是 Bean 之间互相依赖比如 A 依赖 BB 又依赖 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 完成初始化后进入一级缓存。然后回到 AA 就可以注入已经创建好的 B最后 A 也完成初始化进入一级缓存同时清理之前的早期引用缓存。这里要注意ObjectFactory不是重新创建 A而是返回 A 的早期引用如果 A 需要 AOP它返回的可能就是代理对象。9. 构造方法出现了循环依赖怎么解决构造器循环依赖 Spring 默认是解决不了的。比如 A 的构造方法需要 BB 的构造方法又需要 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。还有事务相关的TransactionalAOP 相关的Aspect、Around、Pointcut。如果是 Spring Boot 项目还会常用SpringBootApplication它是启动类上的复合注解。