Java面试-05-框架 Spring全家桶面试题Spring SpringMVC MyBatis SpringBoot目录一、Spring 核心1. 对 Spring 的理解2. IOC DI3. Autowired 和 Resource 区别4. Bean 作用域5. 单例 Bean 线程安全吗6. Spring 启动流程7. Spring 常用设计模式8. Bean 生命周期二、AOP 面向切面1. 核心概念2. 通知类型3. 动态代理对比4. AOP 实现日志示例三、Spring 事务1. 事务管理方式2. 事务传播级别3. 事务隔离级别4. 事务失效场景四、循环依赖与三级缓存1. 什么是循环依赖2. 三级缓存3. 如何避免循环依赖五、BeanFactory 和 FactoryBean六、SpringMVC1. 执行流程2. 常用注解3. 返回 JSON七、MyBatis1. #{} 和 ${} 区别2. 缓存3. 动态 SQL4. 批量操作5. 主键回填八、SpringBoot1. 理解 SpringBoot2. 核心注解 SpringBootApplication3. 自动配置原理4. 启动流程5. 配置文件6. 多环境切换一、Spring 核心1. 对 Spring 的理解Spring 是一个IOC 容器 AOP 框架一站式解决企业级开发。核心思想控制反转 IOC、依赖注入 DI、面向切面 AOP。简化开发、解耦、管理对象生命周期、提供事务、整合第三方框架。2. IOC DIIOC 控制反转对象创建权从开发者new反转交给 Spring 容器管理。DI 依赖注入容器在创建 Bean 时自动为 Bean 注入依赖属性。注入方式构造器注入Setter 注入注解自动注入Autowired / Resource3. Autowired 和 Resource 区别AutowiredSpring 注解按类型装配需要按名时配合 Qualifier。ResourceJ2EE 注解默认按名称装配名称找不到再按类型。4. Bean 作用域singleton默认单例整个容器一个实例。prototype每次获取都新建实例。request一次 HTTP 请求内有效。session一个会话内有效。globalSession全局会话集群环境。5. 单例 Bean 线程安全吗不安全。单例 Bean 被多线程共享若存在可变成员变量会有线程安全问题。解决无状态设计、加锁、使用 ThreadLocal。6. Spring 启动流程资源定位加载配置/注解。BeanDefinition 加载解析 Bean 信息。注册注册到 BeanDefinitionRegistry。实例化 依赖注入 初始化创建 Bean 并填充属性。容器就绪对外提供 Bean。7. Spring 常用设计模式代理模式AOP 底层JDK 代理 / CGLIB。单例模式Bean 默认 singleton。工厂模式BeanFactory 生产对象。模板方法JdbcTemplate、RestTemplate。观察者模式容器事件。8. Bean 生命周期实例化构造方法属性填充DI 依赖注入初始化前BeanPostProcessor初始化init-method / PostConstruct初始化后正常使用销毁destroy-method / PreDestroy二、AOP 面向切面1. 核心概念Aspect 切面横切逻辑的模块化日志、事务。JoinPoint 连接点程序执行点方法执行、异常抛出。PointCut 切点匹配哪些方法需要增强。Advice 通知增强逻辑执行时机。2. 通知类型Before前置After后置无论是否异常AfterReturning正常返回后AfterThrowing异常后Around环绕通知最强大3. 动态代理对比JDK 动态代理基于接口生成代理类实现目标接口。CGLIB基于继承生成子类代理无需接口。AspectJ编译期/类加载期直接修改字节码功能最强、性能最高。4. AOP 实现日志示例使用Aspect定义一个切面类使用PointCut在类中定义一个切点定义通知方法Before(前置通知) After(后置通知) AfterReturnning(返回后通知)AfterThrowing(异常通知) Around(环绕通知)三、Spring 事务1. 事务管理方式编程式事务手动控制 begin / commit / rollback灵活但繁琐。声明式事务Transactional基于 AOP无侵入推荐使用。2. 事务传播级别REQUIRED默认有则加入无则新建。SUPPORTS有事务就加没有就非事务运行。MANDATORY必须在事务内运行否则抛异常。REQUIRES_NEW新建事务挂起外层事务。NOT_SUPPORTED非事务运行挂起当前事务。NEVER非事务运行有事务抛异常。NESTED嵌套事务外层回滚则内层回滚内层异常不影响外层。3. 事务隔离级别READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE4. 事务失效场景方法非 public同类内部方法调用没经过代理异常被 catch 没抛出传播机制设置不当未被 Spring 管理四、循环依赖与三级缓存1. 什么是循环依赖A 依赖 BB 依赖 A形成闭环。2. 三级缓存Spring 解决方式一级缓存 singletonObjects成品单例 Bean。二级缓存 earlySingletonObjects早期半成品 Bean。三级缓存 singletonFactories提前暴露的 Bean 工厂用于 AOP 代理。Spring 通过三级缓存在 Bean 实例化后但未初始化时将其工厂放入二级缓存提前暴露。当出现循环依赖可从二级缓存获取工厂得到早期 Bean 用于注入完成初始化再将完整 Bean 放入一级缓存。3. 如何避免循环依赖重构代码解除循环引用使用 Lazy 懒加载使用 setter 注入构造注入无法解决五、BeanFactory 和 FactoryBeanBeanFactoryIOC 容器顶层接口负责加载、管理 Bean。FactoryBean工厂 Bean 接口用于创建复杂对象可自定义实例化逻辑。六、SpringMVC1. 执行流程客户端请求 → DispatcherServletHandlerMapping 找到对应 ControllerHandlerAdapter 执行方法返回 ModelAndViewViewResolver 解析视图渲染页面 → 响应客户端2. 常用注解ControllerServiceRepositoryComponentAutowiredRequestMapping / GetMapping / PostMappingResponseBodyPathVariableRequestParam3. 返回 JSON方法上加ResponseBody或类上加 RestController。七、MyBatis1. #{} 和 ${} 区别#{}预编译占位符?防 SQL 注入。${}字符串直接替换存在注入风险用于动态表名/排序字段。2. 缓存一级缓存SqlSession 级别默认开启。二级缓存Mapper 级别跨 SqlSession 共享需手动开启。查询顺序二级缓存 → 一级缓存 → DB。3. 动态 SQL条件判断自动去除多余 AND/OR更新用去除多余逗号遍历集合in、批量插入自定义前后缀switch 分支4. 批量操作批量插入foreach拼接 values。批量删除foreach构建 IN 条件。批量更新循环多条 update允许多语句执行。5. 主键回填useGeneratedKeys“true” keyProperty“id”八、SpringBoot1. 理解 SpringBoot简化 Spring 开发约定大于配置。内嵌 Tomcat可打成 jar 独立运行。starter 自动依赖管理。EnableAutoConfiguration 自动配置。零 XML。2. 核心注解 SpringBootApplication由 3 个注解合成SpringBootConfiguration配置类EnableAutoConfiguration开启自动配置ComponentScan包扫描3. 自动配置原理EnableAutoConfiguration 开启。读取 META-INF/spring.factories 中的自动配置类。通过 Conditional 条件判断是否生效。满足条件则注册 Bean。4. 启动流程运行主类构造 SpringApplication准备环境、加载配置创建 ApplicationContext自动配置、扫描 Bean实例化初始化启动 Web 容器发布启动完成事件5. 配置文件application.yml/properties应用配置。bootstrap.yml/properties父上下文优先加载用于配置中心。6. 多环境切换application-dev/test/prod.ymlspring.profiles.activedev 指定环境