首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring 2.5 註解驅動 IoC 完整指南:從 XML 到註解的遷移之路

     編輯:Java 相關知識

Spring 2.5 引入豐富的註解支援,標誌著配置方式從冗長的 XML 向類內聚、零配置演進。註解配置利用 Java 反射機制自動推導元數據,減少樣板代碼;將配置與業務邏輯共存同一檔案,增強內聚性;並提供 @Autowired、@Resource、@Component 等核心註解,實現依賴注入與 Bean 定義的全註解化。

傳統 XML 配置回顧

<bean id="boss" class="com.baobaotao.Boss">
    <property name="car" ref="car"/>
    <property name="office" ref="office"/>
</bean>
<bean id="office" class="com.baobaotao.Office">
    <property name="officeNo" value="002"/>
</bean>
<bean id="car" class="com.baobaotao.Car" scope="singleton">
    <property name="brand" value="紅旗 CA72"/>
    <property name="price" value="2000"/>
</bean>

核心註解詳細解析

1. @Autowired - 類型驅動自動裝配

可標註於欄位、Setter、建構子,預設 byType 匹配:

// 欄位注入 (推薦:簡潔、不可變、易測試)
@Autowired
private Car car;

@Autowired
private Office office;

// Setter 注入
@Autowired
public void setCar(Car car) { this.car = car; }

// 建構子注入 (Spring 4.3+ 單建構子可省略 @Autowired)
@Autowired
public Boss(Car car, Office office) {
    this.car = car;
    this.office = office;
}

啟用條件:需在 Spring 容器註冊 AutowiredAnnotationBeanPostProcessor,或使用 <context:annotation-config/>。

2. @Qualifier - 解決多候選 Bean 歧義

當同類型 Bean >1 時,配合 @Autowired 指定 Bean 名稱,策略轉為 byName:

@Autowired
@Qualifier("office")
private Office office;

// 建構子參數
@Autowired
public Boss(Car car, @Qualifier("office") Office office) { ... }

3. @Resource (JSR-250) - 名稱驅動裝配

預設 byName,屬性 name 指定 Bean 名稱,type 指定類型:

@Resource  // byName: 欄位名 "car" 對應 bean name "car"
private Car car;

@Resource(name = "office")  // 明確指定 bean name
private Office office;

啟用條件:需註冊 CommonAnnotationBeanPostProcessor 或 <context:annotation-config/>。

4. @PostConstruct / @PreDestroy - 生命週期回調

替代 init-method/destroy-method,支援多方法標註:

@PostConstruct
public void initCache() { ... }

@PostConstruct
public void warmUp() { ... }  // 多個初始化方法皆會執行

@PreDestroy
public void cleanup() { ... }

5. @Component / @Service / @Repository / @Controller - Bean 定義註解

替代 <bean> 宣告,掃描機制自動發現:

@Component("boss")  // 可選名稱,預設類名首字母小寫
public class Boss { ... }

@Service  // 業務層語義
public class UserService { ... }

@Repository  // 持久層語義,自動轉換 DataAccessException
public class UserDao { ... }

@Controller  // 控制層語義
public class UserController { ... }

掃描機制啟用:<context:component-scan>

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
    xmlns:context="https://www.springframework.org/schema/context"
    xsi:schemaLocation="...
        https://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <!-- 掃描基礎包,遞歸子包,隱式註冊 4 個 BeanPostProcessor -->
    <context:component-scan base-package="com.baobaotao"/>
    
    <!-- 進階過濾範例 -->
    <context:component-scan base-package="com.baobaotao">
        <context:include-filter type="regex" expression="com\.baobaotao\.service\..*"/>
        <context:exclude-filter type="aspectj" expression="com.baobaotao.util..*"/>
    </context:component-scan>
</beans>

過濾器類型:annotation、assignable (類名)、regex、aspectj

@Scope 定義 Bean 作用域

@Scope("prototype")
@Component("boss")
public class Boss { ... }  // 每次 getBean 返回新實例

註解 vs XML:適用場景決策矩陣

場景推薦方式理由
自有類別、依賴固定不變註解內聚性高、無需重編譯調整
第三方類 (DataSource, SessionFactory)XML無法修改源碼加註解
部署環境差異化配置 (JNDI 名稱、連接池參數)XML外部化配置、無需重打包
複雜 AOP/事務切點表達式XML (aop/tx ns)表達力更強、可讀性更好
屬性檔案佔位符解析XML + <context:property-placeholder>標準化外部化配置

最佳實踐建議

  1. 分層語義化:Service 層用 @Service、DAO 層用 @Repository、Controller 用 @Controller、通用組件用 @Component
  2. 建構子注入優先:不可變依賴、易於單元測試、循環依賴快速失敗
  3. 混合配置:基礎設施 Bean (DataSource、TransactionManager) 用 XML,業務 Bean 用註解
  4. 避免循環依賴:重構設計或使用 @Lazy/Setter 注入緩解
  5. 測試配置隔離:測試專用 @Configuration 類替代完整掃描

Spring 註解驅動 IoC 不只是語法糖,更是推動「配置即代碼、約定優於配置」工程文化的關鍵里程碑。合理混用註解與 XML,才能兼得開發效率與部署靈活性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved