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

Spring 核心注解:@Autowired、@Resource、@Service 深度對比

     編輯:Java 綜合教學

Spring 核心注解:@Autowired、@Resource、@Service 深度對比

注解驅動開發是現代 Spring 的主流模式。本文從 XML 配置演進切入,詳細對比三大核心注解的用法、匹配規則、優缺點及最佳實踐。

演進:從 XML 到注解

<!-- XML 配置 -->
<bean id="zoo" class="Zoo">
    <property name="tiger" ref="tiger"/>
    <property name="monkey" ref="monkey"/>
</bean>

缺點:XML 膨脹、Java/XML 來回切換、可讀性差。

@Autowired:類型優先自動裝配

@Service public class Zoo {
    @Autowired private Tiger tiger;
    @Autowired private Monkey monkey;
}
  • 默認 byType 匹配;
  • 多實現需 @Qualifier("beanName") 指定;
  • @Autowired(required=false) 允許為 null;
  • 屬於 Spring 專有注解(org.springframework.beans.factory.annotation)。

@Resource:J2EE 標準,名稱優先

@Service public class Zoo {
    @Resource(name="tiger") private Tiger tiger;
    @Resource(type=Monkey.class) private Monkey monkey;
}
  • 匹配順序:name > type > 默認 byName;
  • 屬於 J2EE 規範(javax.annotation),建議優先使用 降低框架耦合;
  • 同時指定 name 和 type 任一不匹配即報錯。

@Service:組件掃描聲明 Bean

@Service public class Tiger { ... }
@Service public class Monkey { ... }
@Service public class Zoo { ... }
  • 聲明類為 Spring Bean,默認 id 為類名首字母小寫(tiger);
  • 可自定義 @Service("myTiger") 指定 id;
  • 配合 @Scope("prototype") 控制作用域(默認 singleton)。

完整配置極簡化

<beans xmlns:context="https://www.springframework.org/schema/context">
    <context:component-scan base-package="com.xrq"/>
</beans>

無需任何 <bean> 定義,所有注解類自動註冊。

常見坑點

  • 同名 Bean 衝突:不同包下同類名且皆 @Service 會拋 ConflictingBeanDefinitionException,需顯式指定不同 id;
  • @Autowired + XML <property> 同時存在,XML 優先導致重複注入報錯;
  • 接口多實現未加 @Qualifier 直接 @Autowired 報 NoUniqueBeanDefinitionException。

總結建議

注解來源默認匹配推薦場景
@AutowiredSpringbyType單一實現、構造器注入
@ResourceJ2EEbyName多實現、跨框架移植
@ServiceSpring組件掃描業務服務層 Bean 聲明
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved