Spring 註解驅動開發已成主流。本文整理最實用的註解分類速查,涵蓋元件掃描、Bean 定義、注入、生命週期、AOP、事務、異步等核心場景,附關鍵屬性說明,適合開發時快速查閱。
<context:component-scan base-package="com.example"/>
<!-- 或 Java Config -->
@ComponentScan("com.example")
base-package 指定掃描根套件,遞迴掃描子套件。
| 註解 | 層級 | 語意 | 特殊功能 |
|---|---|---|---|
@Component | 通用 | 泛型元件,無法歸類時使用 | — |
@Repository | 資料存取層 (DAO) | 資料庫操作元件 | 自動轉換 JDBC 例外為 Spring DataAccessException |
@Service | 業務邏輯層 | 業務服務元件 | 標示交易邊界建議位置 |
@Controller | 表現層 (Spring MVC) | 控制器 | 配合 @RequestMapping 處理 HTTP 請求 |
@RestController | REST API | @Controller + @ResponseBody | 直接回傳 JSON/XML,不解析視圖 |
| 註解 | 用途 | 關鍵屬性/說明 |
|---|---|---|
@Configuration | 標示配置類別 | 類別內 @Bean 方法定義 Bean |
@Bean | 方法上宣告 Bean | name, initMethod, destroyMethod |
@Scope | 指定作用域 | singleton(預設)、prototype、request、session、application |
@Lazy | 延遲初始化 | @Lazy(true) 僅在首次注入時建立 |
@Primary | 自動裝配首選 | 多個同型 Bean 時優先注入此 Bean |
@DependsOn | 強制初始化順序 | @DependsOn("otherBean") 確保 otherBean 先初始化 |
| 註解 | 裝配規則 | 適用位置 | 備註 |
|---|---|---|---|
@Autowired | byType → byName (配合 @Qualifier) | 建構子、Setter、欄位 | required=false 可選注入 |
@Qualifier("beanName") | 指定 Bean 名稱 | 配合 @Autowired | 解決多實例衝突 |
@Resource | byName → byType | 欄位、Setter | JSR-250 標準,name 屬性指定 |
@Inject | byType | 建構子、欄位、方法 | JSR-330 標準,無 required 屬性 |
@Value("${prop}") | 注入屬性值 | 欄位、參數 | 支援 SpEL: #{systemProperties['os.name']} |
@PostConstruct // 初始化後執行(相當於 init-method)
@PreDestroy // 銷毀前執行(相當於 destroy-method)
方法簽名:void methodName(),不可有參數、不可拋受檢例外。
| 註解 | 說明 |
|---|---|
@EnableAspectJAutoProxy | 啟用 @AspectJ 自動代理 |
@Aspect | 標示切面類別 |
@Pointcut | 定義切入點運算式 |
@Before/@After/@Around | 通知類型 |
@Transactional | 宣告式事務:類別/方法上 |
@EnableTransactionManagement | 啟用註解驅動事務 |
@Transactional 關鍵屬性:propagation(傳播行為)、isolation(隔離級別)、timeout、readOnly、rollbackFor。
@EnableAsync // 啟用非同步支援
@Async("taskExecutor") // 方法標示非同步執行,可指定執行緒池 Bean 名稱
@EnableScheduling // 啟用排程
@Scheduled(cron="0 0 12 * * ?") // 方法定時執行
需配置 ThreadPoolTaskExecutor Bean 名為 taskExecutor。
| 註解 | 用途 |
|---|---|
@Profile("dev") | 僅在指定環境啟用 Bean |
@ConditionalOnClass | 類別路徑存在時才裝配 |
@ConditionalOnMissingBean | 無同型 Bean 時才裝配 |
@PropertySource("classpath:app.properties") | 載入外部屬性檔 |
@ConfigurationProperties(prefix="app") | 將屬性綁定至 POJO |
@RequestMapping("/api") // 類別/方法層級路徑映射
@GetMapping("/users") // 組合註解:@RequestMapping(method=GET)
@PostMapping("/users")
@PathVariable Long id // 路徑變數綁定
@RequestParam String name // 查詢參數綁定
@RequestBody UserDTO dto // JSON 請求體綁定
@ResponseBody // 直接寫入 HTTP Response Body
@RestController // @Controller + @ResponseBody
@ControllerAdvice // 全域例外處理、資料綁定
@ExceptionHandler(Exception.class)
@SpringBootTest // 整合測試啟動完整上下文
@MockBean // 替換為 Mockito Mock
@AutoConfigureMockMvc // 自動配置 MockMvc
@Test
@Transactional // 測試結束自動回滾
熟練掌握上述註解可大幅提升 Spring 開發效率。建議:
@Primary/@Qualifier 解決多實例歧義。