🤟致敬讀者
- 🟩感謝閱讀🟦笑口常開🟪生日快樂?早點睡覺
📘博主相關
- 🟧博主信息🟨博客首頁🟫專欄推薦🟥活動信息
文章目錄
- Spring Boot 常用注解面試題深度解析
- 一、核心啟動注解(必考)
- 二、Bean 管理與依賴注入
- 三、Spring MVC 注解
- 四、配置與屬性綁定
- 五、高級特性注解
- 六、事務與測試
- 七、生產實踐與高頻問題
- 高頻面試題匯總
- 總結:Spring Boot 注解學習路徑
📃文章前言
- 🔷文章均為學習工作中整理的筆記。
- 🔶如有錯誤請指正,共同學習進步。
Spring Boot 常用注解面試題深度解析
以下精選 25+ 高頻注解面試題,涵蓋核心原理、實戰技巧及源碼級分析,助你輕松應對面試挑戰。
一、核心啟動注解(必考)
-
@SpringBootApplication
的作用是什么?包含哪些關鍵注解?
答:- 核心作用:開啟自動配置 + 組件掃描 + 配置類聲明
- 元注解組成:
@SpringBootConfiguration // 聲明為配置類 @EnableAutoConfiguration // 啟用自動配置 @ComponentScan // 包掃描(默認當前包及其子包)
-
@EnableAutoConfiguration
如何實現自動裝配?
答:- 加載
META-INF/spring.factories
中的配置類 - 通過
@Conditional
系列注解按條件裝配 Bean - 核心流程:
graph LR A[啟動類] --> B[@SpringBootApplication] B --> C[@EnableAutoConfiguration] C --> D[AutoConfigurationImportSelector] D --> E[加載spring.factories] E --> F[過濾@Conditional條件] F --> G[注冊Bean定義]
- 加載
二、Bean 管理與依賴注入
-
@Component
與@Bean
的區別?
對比表:特性 @Component
@Bean
作用目標 類聲明 方法聲明 控制權 Spring 自動實例化 開發者手動創建對象 適用場景 自定義類 第三方庫組件 依賴注入 支持 @Autowired
需在配置類中使用 -
@Autowired
和@Resource
的區別?
答:@Autowired
:- 按類型注入 →
byType
- 支持
@Qualifier
指定名稱 - 是 Spring 原生注解
- 按類型注入 →
@Resource
:- 默認按名稱注入 →
byName
(失敗時回退到 byType) - JDK 原生注解(
javax.annotation
)
- 默認按名稱注入 →
// 示例 @Autowired @Qualifier("mysqlService") private DataService service1;@Resource(name = "oracleService") private DataService service2;
三、Spring MVC 注解
-
@RestController
和@Controller
的區別?
答:@Controller
:- 需要配合
@ResponseBody
返回 JSON - 通常返回視圖名稱
- 需要配合
@RestController
=@Controller
+@ResponseBody
- 所有方法自動 JSON 序列化
// 傳統寫法 @Controller public class OldController {@ResponseBodypublic User getUser() { /* ... */ } }// 現代寫法 @RestController public class NewController {@GetMapping("/user")public User getUser() { /* ... */ } // 自動轉JSON }
-
@PathVariable
與@RequestParam
的應用場景?
對比:注解 位置 示例 URL 獲取方式 @PathVariable
URL 路徑 /users/{id}
id = 123
@RequestParam
查詢字符串 /search?keyword=Spring
keyword = "Spring"
四、配置與屬性綁定
-
@Value
與@ConfigurationProperties
如何選擇?
答:@Value
:- 適合單個屬性注入
- 支持 SpEL 表達式
@Value("${server.port}") private int port;
@ConfigurationProperties
:- 批量綁定屬性到對象
- 支持類型安全校驗
@ConfigurationProperties(prefix = "datasource") public class DataSourceConfig {private String url;private String username;// getters/setters }
-
@PropertySource
加載自定義配置的注意事項?
答:- 默認不支持 YAML 文件(需配合
YamlPropertySourceFactory
) - 多文件加載順序決定屬性覆蓋關系
@Configuration @PropertySource(value = "classpath:custom.properties", encoding = "UTF-8") public class AppConfig { /* ... */ }
- 默認不支持 YAML 文件(需配合
五、高級特性注解
-
@Conditional
系列注解的工作原理?(重點)
核心條件注解:注解 激活條件 @ConditionalOnClass
類路徑存在指定類 @ConditionalOnBean
Spring 容器存在指定 Bean @ConditionalOnProperty
配置屬性匹配條件 @ConditionalOnWebApplication
當前是 Web 應用 源碼解析:
// 自定義條件 public class EnvCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String env = context.getEnvironment().getProperty("app.env");return "prod".equals(env);} }// 使用示例 @Bean @Conditional(EnvCondition.class) public Service prodService() { /* ... */ }
-
@Async
實現異步調用的線程池配置?
最佳實踐:@Configuration @EnableAsync public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix("Async-");return executor;} }// 使用 @Service public class EmailService {@Async("taskExecutor") // 指定線程池public void sendEmail() { /* ... */ } }
六、事務與測試
-
@Transactional
在類和方法上的優先級?
規則:- 方法注解 > 類注解
- 接口注解無效(需基于類代理)
@Service @Transactional // 類級別默認事務 public class UserService {public void updateProfile() { /* 使用類事務 */ }@Transactional(propagation = Propagation.REQUIRES_NEW)public void auditLog() { /* 獨立事務 */ } }
-
@SpringBootTest
和@WebMvcTest
的區別?
對比:測試注解 測試范圍 啟動容器 適用場景 @SpringBootTest
完整集成測試 是 服務層/DAO層測試 @WebMvcTest
僅Web MVC層 否 控制器單元測試 @DataJpaTest
僅JPA組件 否 倉庫層測試 // 控制器測試示例 @WebMvcTest(UserController.class) public class UserControllerTest {@Autowired MockMvc mvc;@MockBean UserService userService;@Testvoid getUserTest() throws Exception {mvc.perform(get("/users/1")).andExpect(status().isOk());} }
七、生產實踐與高頻問題
-
如何自定義 Starter?
關鍵步驟:- 創建
xxx-spring-boot-autoconfigure
模塊 - 編寫自動配置類:
@Configuration @ConditionalOnClass(MyService.class) @EnableConfigurationProperties(MyProperties.class) public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService(MyProperties props) {return new MyService(props);} }
- 在
META-INF/spring.factories
注冊:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.example.MyAutoConfiguration
- 創建
-
@ControllerAdvice
的三種用法?
答:@ControllerAdvice public class GlobalHandler {// 1. 異常處理@ExceptionHandler(NotFoundException.class)public ResponseEntity<Error> handleNotFound(NotFoundException ex) {return ResponseEntity.status(404).body(new Error(ex.getMessage()));}// 2. 數據綁定預處理@InitBinderpublic void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Date.class, new CustomDateEditor(...));}// 3. 模型數據增強@ModelAttributepublic void addCommonModel(Model model) {model.addAttribute("appName", "MyApp");} }
高頻面試題匯總
@SpringBootApplication
的三個核心注解分別起什么作用?@Autowired
注入失敗有哪些可能原因?答:未掃描包、多個實現類未限定、Bean未創建、靜態字段注入等
- 如何讓
@Scheduled
定時任務在集群中只執行一次?答:配合
@ConditionalOnProperty
或分布式鎖(如 Redis Lock) @Transactional
失效的常見場景?答:自調用、非 public 方法、異常類型錯誤、數據庫引擎不支持
@RequestParam
vs@RequestBody
的區別?答:前者處理 URL 參數,后者處理 JSON/XML 請求體
總結:Spring Boot 注解學習路徑
- 基礎層:
- 啟動注解:
@SpringBootApplication
- Bean 管理:
@Component
,@Bean
,@Autowired
- 啟動注解:
- Web 層:
- REST 控制:
@RestController
,@GetMapping
- 參數處理:
@PathVariable
,@RequestBody
- REST 控制:
- 數據層:
- 數據訪問:
@Repository
,@Transactional
- 配置綁定:
@ConfigurationProperties
- 數據訪問:
- 高級特性:
- 條件裝配:
@Conditional
系列 - 異步處理:
@Async
,@EnableAsync
- 條件裝配:
- 測試與生產:
- 測試切片:
@WebMvcTest
,@DataJpaTest
- 全局處理:
@ControllerAdvice
,@RestControllerAdvice
- 測試切片:
掌握這些注解的原理和應用場景,不僅能輕松應對面試,更能構建健壯高效的 Spring Boot 應用。
📜文末寄語
- 🟠關注我,獲取更多內容。
- 🟡技術動態、實戰教程、問題解決方案等內容持續更新中。
- 🟢《全棧知識庫》技術交流和分享社區,集結全棧各領域開發者,期待你的加入。
- 🔵?加入開發者的《專屬社群》,分享交流,技術之路不再孤獨,一起變強。
- 🟣點擊下方名片獲取更多內容🍭🍭🍭👇