1. 说说Spring Boot常用的注解。

img_28.png
Spring Boot常用注解包括:

  • @SpringBootApplication(主启动类)
  • @RestController(定义REST控制器)
  • @RequestMapping(映射HTTP请求)
  • @Autowired(依赖注入)
  • @Configuration和@Bean(配置类及组件注册)。
  • 此外还有@Service、@Repository等分层标识注解。

2. 说说Spring Boot的启动流程。

标准回答:

  • Spring Boot 将日常企业应用研发中的各种场景都抽取出来,做成一个个的 starter(启动器)。
  • starter 中整合了该场景下各种可能用到的依赖,用户只需要在 Maven 中引入 starter 依赖,SpringBoot 就能自动扫描到要加载的信息并启动相应的默认配置。
  • starter 提供了大量的自动配置,让用户摆脱了处理各种依赖和配置的困扰。所有这些 starter 都遵循着约定成俗的默认配置,并允许用户调整这些配置,即遵循“约定大于配置”的原则。
  • 那么我们看构建的项目的pom.xml文件中的starter配置。
1
2
3
4
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
  • 以 spring-boot-starter-web 为例,它能够为提供 Web 开发场景所需要的几乎所有依赖,因此在使用 Spring Boot 开发 Web 项目时,只需要引入该 Starter 即可,而不需要额外导入 Web 服务器和其他的 Web 依赖。

Spring Boot 的启动流程可简化为以下步骤:

  • 入口触发:通过 @SpringBootApplication 主类的 main 方法调用 SpringApplication.run()。
  • 环境准备:加载配置、激活 Profile,确定应用运行环境。
  • 上下文创建:根据应用类型(Web/非 Web)实例化对应的 ApplicationContext。
  • 自动配置:通过 @EnableAutoConfiguration 加载并过滤自动配置类,注册必要 Bean。
  • 容器刷新:完成 Bean 的注册、实例化和依赖注入,启动内置 Web 服务器(若为 Web 应用)。
  • 应用就绪:触发事件通知,执行启动后逻辑(如 CommandLineRunner),最终对外提供服务。

3. 说说你对IoC的理解。

  • spring中的ioc是控制反转,通过容器对对象的创建进行统一的管理,将对象的创建权力交给spring。
  • 不需要我们在代码中显示的使用new的方式进行擦行间,降低了代码之间的依赖关系和耦合度。
  • 当我们类中属性依赖了其他对象的属性,spring根据DI依赖注入的方式动态的为属性注入值,这是IOC的实现方式。

4. 说说你对AOP的理解。

  • aop是一种面向切面编程的编程思想; 有切面,连接点,通知,切点。 本质就是功能的扩展,属于IOC的增强
  • aop是基于动态代理的技术,在程序运行的时候,动态的修改class字节码生成新的class文件进行运行的技术,可以对某个类的某个方法或者多个类的多个方法,通过配置切点表达式进行匹配,然后改造被匹配到的类的某一些方法,然后运行
  • 动态代理已知两种,cjlib的基于子类的动态代理,jdk自带的基于接口的动态代理。
  • 常见的aop使用场景,日志统一管理,事务管理器。

5. 说说Bean的生命周期。

  • 实例化:Spring 通过反射创建 Bean 空对象,单例只创建一次,原型每次获取都新建。
  • 属性填充:对 Bean 进行依赖注入,给属性赋值,完成 @Autowired、setter 等注入。
  • Aware 接口感知:执行 BeanNameAware、BeanFactoryAware,让 Bean 知道自己名字和所属容器。
  • BeanPostProcessor 前置:初始化前对 Bean 统一增强,AOP、动态代理等核心逻辑会在这里预处理。
  • 初始化:执行 @PostConstruct → afterPropertiesSet → 自定义 init-method。
  • BeanPostProcessor 后置:初始化后对 Bean 做最终处理,AOP 代理对象通常在这里生成。
  • 使用阶段:Bean 正常工作,业务调用、依赖使用都在这个阶段,单例长期驻留容器。
  • 销毁:容器关闭时执行 @PreDestroy → destroy → 自定义 destroy-method,释放资源。

6. 说说@Autowired和@Resource注解的区别。

  1. 所属来源
  • @Autowired:Spring 框架自带注解,耦合 Spring;
  • @Resource:JDK 原生注解(JSR-250),通用性更强。
  1. 注入依据
  • @Autowired:默认按类型注入,同类型多 Bean 需配 @Qualifier 指定名称;
  • @Resource:默认按名称注入,可通过 name/type 属性灵活切换。
  1. 配置特性
  • @Autowired:支持 required = false,找不到 Bean 不报错;
  • @Resource:无 required 属性,找不到 Bean 直接抛出异常。
  1. 注入场景
  • @Autowired:支持字段、方法、构造器、参数,还能泛型注入;
  • @Resource:仅支持字段、方法,不支持构造器和泛型注入。

7. 说说Spring事务管理。

spring支持编程式事务管理和声明式事务管理两种方式:

  • ①编程式事务管理使用TransactionTemplate:需手动通过 TransactionTemplate 编写事务逻辑,事务代码与业务代码耦合,但能精准控制到代码块级别,适用于需精细管控事务范围的特殊场景。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@Service
public class TransferService {
@Autowired
private TransactionTemplate transactionTemplate; // 核心工具类
@Autowired
private AccountMapper accountMapper;

// 转账业务 - 编程式事务
public void transfer(Long fromId, Long toId, BigDecimal amount) {
// 手动用TransactionTemplate包裹事务逻辑
transactionTemplate.execute(status -> {
try {
// 1. 扣减转出账户余额
accountMapper.decreaseBalance(fromId, amount);
// 模拟异常(比如转账失败)
// int a = 1 / 0;
// 2. 增加转入账户余额
accountMapper.increaseBalance(toId, amount);
return true; // 执行成功,自动提交事务
} catch (Exception e) {
status.setRollbackOnly(); // 手动标记回滚
throw new RuntimeException("转账失败,事务回滚", e);
}
});
}
}
  • ②声明式事务管理建立在AOP之上的:依托 AOP 对方法进行前后拦截,自动完成事务的开启、提交 / 回滚,无需在业务代码中掺杂事务逻辑,仅通过配置或 @Transactional 注解即可实现,无侵入性且开发效率高,但事务粒度仅能到方法级别,是日常开发的首选方式。
    • 其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前启动一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
    • 声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中,减少业务代码的污染。
    • 唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。

8. 介绍一下Spring MVC的执行流程。

  • 用户点击某个请求路径,发起一个 HTTP request 请求,该请求会被提交到 DispatcherServlet(前端控制器);
  • 由 DispatcherServlet 请求一个或多个 HandlerMapping(处理器映射器),并返回一个执行链(HandlerExecutionChain)。
  • DispatcherServlet 将执行链返回的 Handler 信息发送给 HandlerAdapter(处理器适配器);
  • HandlerAdapter 根据 Handler 信息找到并执行相应的 Handler(常称为 Controller);
  • Handler 执行完毕后会返回给 HandlerAdapter 一个 ModelAndView 对象(Spring MVC的底层对象,包括 Model 数据模型和 View 视图信息);
  • HandlerAdapter 接收到 ModelAndView 对象后,将其返回给 DispatcherServlet ;
  • DispatcherServlet 接收到 ModelAndView 对象后,会请求 ViewResolver(视图解析器)对视图进行解析;
  • ViewResolver 根据 View 信息匹配到相应的视图结果,并返回给 DispatcherServlet;
  • DispatcherServlet 接收到具体的 View 视图后,进行视图渲染,将 Model 中的模型数据填充到 View 视图中的 request 域,生成最终的 View(视图);
  • 视图负责将结果显示到浏览器(客户端)。

请求发送==>DispatcherServlet(前端控制器)==>HandlerMapping(处理器映射器)==>执行Chain(HandlerExecutionChain)==>Handler==>HandlerAdapter(处理器适配器)==>Handler(常称为 Controller)
==>HandlerAdapter 一个 ModelAndView 对象==>返回给 DispatcherServlet==>请求 ViewResolver(视图解析器)==>View 信息匹配到相应的视图结果,并返回给 DispatcherServlet==>视图负责将结果显示到浏览器

9. @Component 和 @Bean 的区别是什么?

  • 1.@Conponent注解作用于类,而@Bean注解作用于方法。
  • 2.@Conponent注解通过类路径扫描来自动侦测以及自动装配到Spring容器中,而@Bean注解是我们在注有该注解的方法中定义产生这个bean,@bean告诉了spring这是某个类的实例,当我需要用它的时候创建这个bean实例。(需要Configuration注解)
  • 3.@Bean注解比@Conponent注解的自定义性更高,当需要引用第三方库中的类装配到spring容器时,只能通过@Bean来实现

10. 讲一下 Spring 中用到的设计模式?

  • 工厂设计模式:用于管理bean对象,包括创建、初始化、销毁等
  • 单例设计模式:默认bean的作用域
  • 动态代理模式:springAop使用了动态代理模式
  • 观察者模式:事件监听的作用
  • 适配器模式:将不兼容的接口转换为客户端期望的接口,如springmvc中handler adapter适配不同的handler
  • 模板方法模式:spring提供一些模板类,如jdbctemplate实现连接不同的数据库,将具体实现步骤放到子类
    等等….

11. Spring循环依赖是什么?介绍下三级缓存。

Spring循环依赖指两个或多个Bean相互注入彼此无法初始化而形成依赖闭环。三级缓存机制解决该问题(只能解决单例模式下的set注入和字段注入):

  1. 一级缓存存放完整初始化后的单例Bean
  2. 二级缓存存储完成实例化但未初始化的早期对象
  3. 三级缓存保留Bean工厂用于生成早期对象
    创建Bean时通过缓存分级暴露对象,避免直接访问未初始化完成的Bean。

12. SpringSecurity是什么?

Spring Security 是 Spring 生态中专注于身份认证(Authentication)和授权(Authorization)的安全框架,用于保护 Java 应用程序(尤其是 Web 应用)的安全。
其核心功能包括: 身份认证:验证用户身份(如用户名密码、OAuth2、JWT 等方式),确认 “你是谁”。
授权控制:判断已认证用户是否有权限访问特定资源(如 URL、方法、数据),决定 “你能做什么”。
其他安全特性:如防止 CSRF 攻击、会话管理、密码加密、记住我功能等。
它通过过滤器链(Filter Chain)实现安全控制,可与 Spring MVC、Spring Boot 等无缝集成,配置灵活(支持 XML、注解、Java Config),能满足从简单到复杂的安全需求。

13. Spring,Spring MVC,Spring Boot 之间什么关系?

  • Spring是Java应用开发的基础框架,提供IoC和AOP核心功能。
  • Spring MVC是基于Spring的Web开发模块,处理MVC架构。
  • Spring Boot是Spring的扩展框架,通过自动配置和简化部署,整合了Spring MVC等模块,降低开发复杂度。
    三者构成递进关系,Boot封装Spring生态,MVC是其子集中的Web方案。

14. SpringBoot 自动配置原理。

  1. 启动入口。@SpringBootApplication触发@EnableAutoConfiguration.
  2. 加载候选配置类:通过SpringFactoriesLoader读取所有MATE-INF/spring.factories中的EnableAutoConfiguration候选类
  3. 条件过滤:使用@Conditional系列注解动态筛选符合条件的配置类(类路径存在、bean不存在、配置属性匹配等)
  4. 顺序调整:通过@AutoConfigurationOrder、@AutoConfigurationBefore等注解调整配置类加载顺序。
  5. 配置生效:符合条件的配置类被加载到spring容器中,自动注册Bean或执行
  6. 用户覆盖:用户自定义的bean或配置属性会覆盖自动配置的默认值。

15. Spring 自动配置原理。

  • 无全自动化配置:纯 Spring 没有 SpringBoot 那种 “按依赖自动创 Bean” 的能力,其 “自动配置” 仅指「注解扫描 + 依赖注入」的半自动配置,替代传统 XML 手动配置。
  • 组件自动注册:通过@ComponentScan(或 XML 的context:component-scan)扫描指定包下带@Component/@Service/@Controller等注解的类,自动创建实例并纳入 IOC 容器,无需手动写标签。
  • 依赖自动注入:通过@Autowired注解,Spring 创建 Bean 时会按 “类型→名称” 自动从容器中匹配并注入依赖,无需手动配置
  • 条件配置基础版:仅提供核心的@Conditional注解(需自定义条件类),无 SpringBoot 封装的@ConditionalOnClass等便捷注解,无法根据依赖 / 配置自动开关配置类。

16. Spring Cloud 的组件有哪些?

  1. 服务注册和发现组件(Eureka或Nacos)
  2. 服务调用组件(openfeign)
  3. 配置中心组件(config)
  4. 服务熔断组件(Sentinel)
  5. 负载均衡组件(LoadBalancer)
  6. 网关组件(Spring Cloud Gateway)

17. 使用Spring框架进行事务管理时,在require_new里,子事务同时操作一个数据会发生什么情况?

在REQUIRES_NEW事务中,子事务操作同一数据可能引发并发冲突,需通过锁机制或业务设计保证数据一致性。