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

Spring 註解驅動開發實戰:從 XML 配置到零配置的完整遷移指南

     編輯:Java 綜合教學

痛點:XML 地獄

傳統 SSH 時代,applicationContext.xml 動輒千行,<bean>、<property>、<constructor-arg> 充斥視野,重構極其痛苦。Spring 2.5+ 引入註解驅動,配合 <context:component-scan>,可實現零 XML 配置 Bean 註冊與注入。

核心啟用:一行 XML 掃描全項目

<context:component-scan base-package="com.example" />

掃描指定包及子包下所有帶註解的類,自動註冊為 Spring Bean。屬性微調:

  • use-default-filters="false" 關閉默認掃描,配合 <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 精確控制
  • base-package 支持多包,逗號分隔

類級註解:四大金剛 + 作用域

註解語義層級典型用途元註解
@Component通用組件工具類、無明確分層@Component
@Repository數據訪問層DAO、Mapper 實現@Component
@Service業務邏輯層Service 實現@Component
@Controller表現層Spring MVC Controller@Component

本質相同:均為 @Component 衍生,僅語義區分,便於 AOP 切面按層攔截(如 execution(* com..service..*(..)))。

作用域控制:@Scope

@Service @Scope("prototype")  // 多例:每次注入創建新實例
public class OrderService { ... }

@Controller @Scope("request")  // Web 請求級(需 Web 環境)
public class FormController { ... }

默認 singleton(單例),有狀態 Bean 必須聲明 prototype/request/session,否則併發安全隱患極大。

字段/方法級注入:三大註解對比

註解來源匹配規則推薦場景
@AutowiredSpring1. byType 2. @Qualifier 指定 name 3. 字段名作為 fallback構造器注入(強制依賴)
@ResourceJSR-2501. byName 2. byType字段/Setter 注入,名稱穩定時
@InjectJSR-330同 @Autowired,無 required 屬性標準化項目

最佳實踐:構造器注入 + final

優勢:不可變、不可為 null、易測試(無需 Spring 容器)、循環依賴啟動時報錯。

進階:自定義類型轉換器(Formatter/Converter)

// 1. 實現 Converter
@Component
public class StringToLocalDateConverter implements Converter<String, LocalDate> {
    @Override public LocalDate convert(String source) {
        return LocalDate.parse(source, DateTimeFormatter.ISO_LOCAL_DATE);
    }
}

// 2. 註冊到 FormattingConversionService
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Override
    public void addFormatters(FormatterRegistry registry) {
        registry.addConverter(new StringToLocalDateConverter());
    }
}

之後 Controller 參數 @RequestParam LocalDate date 自動轉換。

遷移檢查清單

  1. 刪除所有 <bean> 定義
  2. 為每個類打上 @Component/@Service/@Repository/@Controller
  3. 將 <property ref=...> 改為 @Autowired/@Resource 構造器注入
  4. 保留必要 XML:數據源、事務管理器、MyBatis Mapper 掃描、第三方庫無註解類
  5. 啟用 <context:component-scan> 覆蓋項目根包
  6. 運行測試驗證 Bean 註冊數量、啟動時間、注入關係

常見坑點

  • 掃描包路徑不對:Controller 在 web 包,Service 在 service 包,base-package 僅掃描 service → Controller 未註冊 → 404
  • 循環依賴:A 注入 B,B 注入 A,均為構造器注入 → 啟動報錯 → 改一邊為 Setter/字段注入或重構
  • 代理類型不匹配:介面用 JDK 動態代理,類用 CGLIB,注入字段聲明為介面類型可避免
  • 多實例 Bean 注入單例:Prototype 注入 Singleton → 只注入首次創建的實例 → 用 ObjectFactory<T> 或 @Lookup 方法注入

總結

註解驅動將配置從「外部 XML」遷移到「代碼內部」,實現配置即代碼、代碼即文檔。核心三步:component-scan 掃描、類級註解分層、構造器注入賦值。配合 @Configuration + @Bean 處理第三方庫,可實現 95%+ 場景零 XML。

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