Spring 3+ 支援組件掃描自動發現 Bean,配合 `@Autowired`/`@Resource`/`@Inject` 實現零 XML 裝配。本文詳解掃描配置、四大層級註解、自動裝配規則、多候選消歧義、數組/集合/Map 注入與實戰 MVC 分層範例。
| 註解 | 語意層級 | 特殊行為 |
|---|---|---|
| @Component | 通用組件 | 基礎註解,其他三者繼承語意 |
| @Repository | 持久層 DAO | 自動轉換持久化異常為 Spring DataAccessException |
| @Service | 業務邏輯層 | 標識業務邊界,便於 AOP 切點匹配 |
| @Controller | 表現層 | Spring MVC 識別,配合 @RequestMapping |
默認 Bean 名稱:非限定類名首字母小寫(`userDaoImpl` → `userDaoImpl`)。可指定:`@Service("myService")`。
或直接 `@Resource(name="userDaoImpl")`(JSR-250,按名稱優先)。
5. 實戰 MVC 分層範例
6. 配置文件 beans.xml
7. 測試驗證
最佳實踐建議
- **構造器注入優先**:不可變依賴、便於單測、避免循環依賴。
- **分層包結構**:`dao`/`service`/`controller` 獨立包,配合 `resource-pattern` 精準掃描。
- **避免字段注入 `@Autowired`**:隱式依賴、反射賦值繞過構造器、難以在非 Spring 環境實例化。
- **主配置類 Java Config 替代 XML**:`@ComponentScan("com.wang")` + `@Import` 組合配置。