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

Spring 註解驅動開發深度實戰:@Autowired、@Resource、掃描機制、XML 繼承與最佳實踐

     編輯:Java 相關知識

Spring 註解核心體系

Spring 2.5+ 引入註解驅動,旨在減少 XML 配置、提升開發效率。核心在於**依賴注入 (DI) 註解**與**組件掃描機制**的結合。

DI 註解三大支柱對比

註解來源預設策略關鍵屬性適用場景
@AutowiredSpring**byType** (類型)required (預設 true)單一候選者、建構子/Setter/欄位注入
@ResourceJSR-250**byName** (名稱)name、type需指定 Bean 名稱、多實現選擇
@QualifierSpring輔助 @Autowired 指定名稱value (beanName)@Autowired 多候選時消歧義

@Resource 解析邏輯

  1. 欄位上:預設用**欄位名**作 beanName 匹配
  2. Setter 上:預設用**屬性名** (去掉 set 首字母小寫) 匹配
  3. 若 name="" 且 byName 失敗 → 退回 byType
  4. 若指定 name="xxx" → **僅** byName,失敗拋異常

@Autowired + @Qualifier 組合拳

@Autowired
@Qualifier("student") // 指定 bean name
private Student student;

// 或建構子注入 (推薦,不可變、易測試)
@Autowired
public Person(@Qualifier("student") Student student) {
    this.student = student;
}

啟用註解處理:XML 配置最小集

<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:context="https://www.springframework.org/schema/context"
       xsi:schemaLocation="...
         https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 僅需這一行啟用 @Autowired/@Resource/@PostConstruct 等 -->
    <context:annotation-config/>
</beans>

組件掃描:零 XML 宣告 Bean

掃描觸發器

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

掃描指定包及子包,自動註冊帶有下列註解的類為 Bean:

註解語義層級等價 XML
@Component通用組件<bean id="className" class="..."/>
@RepositoryDAO/持久層+ 異常轉換 AOP
@Service業務邏輯層語義標記
@ControllerWeb 控制層語義標記、Spring MVC 掃描

Bean 名稱預設:類名首字母小寫 (如 UserServiceImpl → userServiceImpl);可指定 @Component("myBean") 自訂。

實戰:文件管理系統重構

介面與實作

public interface Document { void read(); void write(); }

@Component("excelDocument")
public class ExcelDocument implements Document { /* ... */ }

@Component("pdfDocument")
public class PDFDocument implements Document { /* ... */ }

@Component("wordDocument")
public class WordDocument implements Document { /* ... */ }

管理類注入

@Component("documentManager")
public class DocumentManager {
    @Resource(name = "excelDocument") // 指定實作
    private Document document;
    
    public void read() { document.read(); }
    public void write() { document.write(); }
}

僅需一行 XML

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

MVC 分層實戰

@Repository("personDao")
public class PersonDaoImpl implements PersonDao { /* ... */ }

@Service("personService")
public class PersonServiceImpl implements PersonService {
    @Resource(name = "personDao")
    private PersonDao personDao;
    // ...
}

@Controller("personAction")
public class PersonAction {
    @Resource(name = "personService")
    private PersonService personService;
    // ...
}

Spring Bean 繼承:XML 時代的複用技巧

注意:基於註解配置**無需**父 Bean 機制,Java 繼承/組合更自然。此處僅作舊專案維護參考。

類繼承 (Bean 定義繼承)

<bean id="baseBean" class="com.example.TestBean" abstract="true">
    <property name="sex" value="male"/>
</bean>

<bean id="bean1" parent="baseBean"/>                    <!-- 繼承屬性 -->
<bean id="bean3" parent="baseBean">                     <!-- 覆蓋屬性 -->
    <property name="sex" value="female"/>
</bean>

屬性繼承 (抽象屬性 Bean)

<bean id="baseSex" abstract="true">
    <property name="sex" value="male"/>
</bean>

<bean id="bean1" class="..." parent="baseSex"> ... </bean>
<bean id="bean2" class="..." parent="baseSex"/>

多個不同類別 Bean 共享相同屬性值,減少 TransactionProxyFactoryBean 等舊式 AOP 配置冗餘。

註解 vs XML 選擇指南

維度註解驅動XML 配置
開發效率高 (碼即配置)低 (切換檔案)
集中管理分散在類上集中在 XML、易全景檢視
環境差異較難 (需 Profile/條件註解)易 (多套 XML)
第三方庫整合無法修改源碼加註解唯一選項
建議**專案主流**:自有代碼用註解**補充**:第三方 Bean、環境差異、基礎設施

最佳實踐總結

  1. 建構子注入優先:不可變依賴、循環依賴早發現、單元測試友好
  2. @Autowired 僅用於建構子/必要欄位,避免欄位注入 (難測試、隱性依賴)
  3. 多實現明確用 @Qualifier 或 @Resource(name),避免 byType 歧義
  4. 掃描包路徑精確控制,避免誤掃描測試/配置類
  5. 分層語義註解:DAO 用 @Repository、Service 用 @Service、Controller 用 @Controller
  6. 混合模式:核心業務註解驅動,基礎設施 (DataSource、TransactionManager、第三方 Client) 用 XML/JavaConfig
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved