注解驅動開發是現代 Spring 的主流模式。本文從 XML 配置演進切入,詳細對比三大核心注解的用法、匹配規則、優缺點及最佳實踐。
<!-- XML 配置 -->
<bean id="zoo" class="Zoo">
<property name="tiger" ref="tiger"/>
<property name="monkey" ref="monkey"/>
</bean>
缺點:XML 膨脹、Java/XML 來回切換、可讀性差。
@Service public class Zoo {
@Autowired private Tiger tiger;
@Autowired private Monkey monkey;
}
@Qualifier("beanName") 指定;@Autowired(required=false) 允許為 null;org.springframework.beans.factory.annotation)。@Service public class Zoo {
@Resource(name="tiger") private Tiger tiger;
@Resource(type=Monkey.class) private Monkey monkey;
}
name > type > 默認 byName;javax.annotation),建議優先使用 降低框架耦合;@Service public class Tiger { ... }
@Service public class Monkey { ... }
@Service public class Zoo { ... }
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> 定義,所有注解類自動註冊。
@Service 會拋 ConflictingBeanDefinitionException,需顯式指定不同 id;@Autowired + XML <property> 同時存在,XML 優先導致重複注入報錯;@Qualifier 直接 @Autowired 報 NoUniqueBeanDefinitionException。| 注解 | 來源 | 默認匹配 | 推薦場景 |
|---|---|---|---|
| @Autowired | Spring | byType | 單一實現、構造器注入 |
| @Resource | J2EE | byName | 多實現、跨框架移植 |
| @Service | Spring | 組件掃描 | 業務服務層 Bean 聲明 |