跳转至

2025年9月5日

面试题

聊聊 Spring 框架中的常用注解(至少五个)

声明Bean

这些注解一般标在类上,告诉Spring这是一个需要交由容器管理的Bean。

  • @Component:通用的组件注解,任何层都能用。
  • @Repository:持久层组件,通常用在DAO类上,语义更清晰。
  • @Service:业务层组件,用在Service实现类上。
  • @Controller:控制层组件,用于Spring MVC的Controller。
  • @RestController:组合注解,相当于@Controller + @ResponseBody,返回JSON数据时常用。

👉这些注解本质上都是@Component,只是语义化区分。

依赖注入

  • @Autowired:自动注入(按类型)。

  • 可以用在构造方法、属性、Setter方法上。

  • 如果存在多个候选Bean,可以配合@Qualifier指定名称。
  • @Qualifier("beanName"):与@Autowired配合,按名称精确注入。
  • @Resource(JSR-250规范):既能按名称注入,也能按类型注入。
  • @Value("${key}"):读取配置文件中的值。

聊聊 SpringMVC 中的常用注解(至少五个)

  • @RequestMapping:定义请求路径和方法。
  • @GetMapping / @PostMapping / @PutMapping / @DeleteMapping:细分HTTP方法。
  • @RequestParam:绑定请求参数到方法参数。
  • @PathVariable:获取路径中的占位符。
  • @RequestBody:接收JSON对象。
  • @ResponseBody:将方法返回值转换为JSON响应。
  • @CrossOrigin:处理跨域请求。

ThreadLocal 的原理(项目中使用场景)

什么是 ThreadLocal?它的名字直译过来就是“线程本地变量”。简单来说,它能给每个线程单独准备一份变量副本,互不干扰。也就是说,即使多个线程同时使用同一个 ThreadLocal 对象,彼此之间的数据也是隔离的。这就好比每个人都有一个私人的抽屉,自己放进去的东西,只有自己能拿到,别人看不到。

午间演讲示例

Java 里的每个线程内部,其实都维护着一个叫做 ThreadLocalMap 的结构。 当我们调用 set() 方法存值时,这个值会存进当前线程自己的 Map 里; 当我们调用 get() 方法取值时,也是从当前线程的 Map 中取。

在项目中,我们会用 ThreadLocal 保存当前登录的用户信息,这样后续的业务代码就不用一层层传递用户对象,直接就能获取。

前端令牌是如何处理的

午间演讲示例

用户登录成功以后,后端会发给前端一个令牌,前端拿到令牌以后,存到 localStorage 中。

接下来,每次请求接口时,前端会在请求头里带上这个令牌。后端收到请求后,就能识别出用户是谁。

如果令牌过期了,后端会返回 401 未授权。

这时候,前端要么跳转到登录页,让用户重新登录,要么如果有刷新令牌机制,就可以自动换一个新的令牌。