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

Spring 註解驅動依賴注入完整指南

     編輯:Java 相關知識

從 XML 到註解的演進

早期 Spring 依賴 XML 配置屬性注入,隨著 Spring 2.5+ 引入註解支援,開發效率大幅提升。本文系統梳理 @Autowired、@Resource、@Qualifier、JSR-250 生命週期註解及 <context:annotation-config/> 的用法與最佳實踐。

傳統 XML 配置方式

<bean id="userManagerImpl" class="com.kedacom.service.UserManagerImpl">
    <property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.kedacom.persistence.UserDaoImpl">
    <property name="sessionFactory" ref="mySessionFactory"/>
</bean>

@Autowired 註解詳解

字段注入

public class UserManagerImpl implements UserManager {
    @Autowired
    private UserDao userDao; // Spring 自動按類型匹配唯一 Bean
}

Setter 方法注入

public class UserManagerImpl implements UserManager {
    private UserDao userDao;
    @Autowired
    public void setUserDao(UserDao userDao) { this.userDao = userDao; }
}

啟用註解處理器

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

@Qualifier 解決多候選衝突

當容器中存在多個同類型 Bean 時,@Autowired 會拋出 BeanCreationException。使用 @Qualifier 指定 Bean 名稱:

@Autowired
public void setUserDao(@Qualifier("userDao") UserDao userDao) { ... }

允許可選依賴:@Autowired(required = false),找不到 Bean 時不報錯,屬性保持 null。

@Resource:JSR-250 標準註解(推薦)

特性@Autowired@Resource
來源Spring 專有JSR-250 標準
默認策略byTypebyName
屬性requiredname, type

裝配優先級

  1. 同時指定 name 和 type:精確匹配唯一 Bean
  2. 指定 name:按名稱匹配
  3. 指定 type:按類型匹配唯一 Bean
  4. 均不指定:按字段名/方法名 byName 匹配,失敗則回退 byType

示例

@Resource(name = "userDao")
private UserDao userDao; // 按名稱注入

@Resource(type = UserDao.class)
private UserDao userDao; // 按類型注入

JSR-250 生命週期註解

@PostConstruct

Bean 初始化完成(實例化 + 依賴注入)後調用,典型場景:向父類私有屬性注入值:

public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
    @Resource
    private SessionFactory mySessionFactory;

    @PostConstruct
    public void injectSessionFactory() {
        super.setSessionFactory(mySessionFactory); // 父類 final setter
    }
}

@PreDestroy

Bean 銷毀前調用,用於資源釋放、連接關閉等清理工作,用法同 @PostConstruct。

一鍵啟用:<context:annotation-config/>

<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.xsd">

    <context:annotation-config/>
</beans>

隱式註冊 4 個後處理器:

  • AutowiredAnnotationBeanPostProcessor:處理 @Autowired/@Qualifier
  • CommonAnnotationBeanPostProcessor:處理 @Resource/@PostConstruct/@PreDestroy
  • PersistenceAnnotationBeanPostProcessor:處理 @PersistenceContext/@PersistenceUnit
  • RequiredAnnotationBeanPostProcessor:處理 @Required

最佳實踐建議

  1. 優先使用 @Resource:標準化、語義清晰、避免 Spring 供應商鎖定。
  2. 構造器注入:強制依賴、不可變性、易於單元測試,配合 @Autowired(單構造器可省略)。
  3. 避免字段注入:難以測試、隱藏依賴、循環依賴檢測較晚。
  4. 配合 @Qualifier 精確定位:多實現場景下消除歧義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved