Spring 註解驅動開發已成主流,掌握核心註解的語義與適用場景是高效開發的前提。本文梳理組件註解與注入註解的核心差異與最佳實踐。
| 註解 | 層級 | 語義 | 建議場景 |
|---|---|---|---|
@Controller | 控制層 | 標識 Spring MVC 控制器 | 處理 HTTP 請求、返回視圖/JSON |
@Service | 業務層 | 標識業務邏輯組件 | 事務邊界、核心業務流程編排 |
@Repository | 持久層 | 標識 DAO 組件,自動轉換持久化異常 | 資料庫操作、MyBatis/JPA Mapper |
@Component | 通用 | 泛型組件標識,無特定語義 | 工具類、配置類、無法歸類組件 |
原理:四者均繼承自 @Component,@ComponentScan 掃描時同等對待。語義化分層有利於代碼閱讀、AOP 切點精準匹配(如 @Transactional 僅切 @Service)。
| 註解 | 來源 | 匹配策略 | 關鍵屬性 | 推薦度 |
|---|---|---|---|---|
@Resource | JSR-250 (J2EE) | byName → byType | name、type | ★★★★★ 減少 Spring 依賴 |
@Autowired | Spring | byType → byName (配合 @Qualifier) | required (default true) | ★★★★ 功能更豐富 |
name,按名稱查找;找不到拋異常。name,預設為欄位名/方法名(setter 去掉 set 首字母小寫),按名稱查找。@Qualifier("beanName") 指定。@Autowired(required=false) 允許找不到時保持 null。@Autowired。@Autowired List<Plugin> plugins 自動注入所有同類型 Bean,順序可用 @Order 控制。@Qualifier 或 @Primary 導致啟動失敗。@Resource 在類級別使用時需指定 name,否則不生效。lateinit 與構造子注入配合。語義化使用 @Controller/@Service/@Repository,依賴注入優先 @Resource(按名)輔以 @Autowired(按類型),構造子注入為首選方式。掌握匹配規則,告別「找不到 Bean」與「多個候選」的啟動報錯。