一文淺析如何在Spring中配置自動(dòng)注入
Spring配置自動(dòng)注入是什么
在 Spring 框架中,“自動(dòng)注入”(Autowiring)是依賴注入(Dependency Injection, DI)的一種具體實(shí)現(xiàn)方式。它允許 Spring 容器自動(dòng)識(shí)別 Bean 之間的依賴關(guān)系,并將所需的依賴 Bean “自動(dòng)”注入到當(dāng)前 Bean 中,而無(wú)需開(kāi)發(fā)人員顯式編寫(xiě) setter 方法或構(gòu)造函數(shù)參數(shù)。
簡(jiǎn)單說(shuō):你只需聲明“我需要一個(gè) X 類型的對(duì)象”,Spring 就會(huì)從容器中找出匹配的 X 實(shí)例,并幫你賦值。
為什么需要自動(dòng)注入?
- 解耦:組件之間不直接通過(guò)
new創(chuàng)建依賴,而是通過(guò)接口聲明,降低耦合。 - 易測(cè)試:可以輕松替換為 Mock 對(duì)象。
- 可維護(hù):依賴關(guān)系集中由 Spring 管理,修改依賴時(shí)無(wú)需改動(dòng)大量代碼。
XML 中配置自動(dòng)注入(autowire)
在 ??<bean>?? 里加 ??autowire??? 屬性即可實(shí)現(xiàn)自動(dòng)注入。
四種自動(dòng)注入策略
- ?
?default??:默認(rèn),不自動(dòng)注入 - ?
?byName??:按屬性名匹配 Bean 的 id - ?
?byType??:按類型匹配(同類型只能有一個(gè) Bean) - ?
?constructor??:按構(gòu)造方法參數(shù)注入
最常用:byType 按類型自動(dòng)注入
<bean id="userDao" class="com.demo.dao.UserDaoImpl"/>
<!-- autowire="byType" 自動(dòng)按類型注入 -->
<bean id="userService" class="com.demo.service.UserServiceImpl"
autowire="byType">
</bean>
Spring 會(huì)自動(dòng)查找: ??UserServiceImpl?? 里的 ??UserDao?? 類型 → 找到 ??userDao?? → 自動(dòng)注入。
byName 按名稱注入
<bean id="userDao" class="com.demo.dao.UserDaoImpl"/>
<bean id="userService" class="com.demo.service.UserServiceImpl"
autowire="byName">
</bean>
要求:屬性名 == bean 的 id ??private UserDao userDao;?? → 匹配 id="userDao"
全局開(kāi)啟自動(dòng)注入(很少用)
<beans default-autowire="byType">
所有 Bean 都自動(dòng)注入。
注解方式自動(dòng)注入(企業(yè)開(kāi)發(fā) 99% 用這個(gè))
開(kāi)啟注解掃描(XML 里加一句)
<context:component-scan base-package="com.demo"/>
使用 ??@Autowired?? 自動(dòng)注入(最核心)
@Service
public class UserServiceImpl implements UserService {
// 自動(dòng)按類型注入
@Autowired
private UserDao userDao;
}
不需要 set 方法!
@Autowired 工作機(jī)制
- 默認(rèn) byType 按類型注入
- 同一類型多個(gè) Bean 時(shí),會(huì)報(bào)錯(cuò)
- 想按名稱匹配,搭配 ?
? @Qualifier("beanId") ??
@Autowired
@Qualifier("userDaoImpl")
private UserDao userDao;
@Resource(Java 標(biāo)準(zhǔn)注解)
效果和 @Autowired 類似,默認(rèn) byName:
@Resource(name = "userDao") private UserDao userDao;
構(gòu)造器注入:官方推薦方式(Spring 4+)
Spring 官方文檔明確推薦:對(duì)于強(qiáng)制性依賴,使用構(gòu)造器注入。
優(yōu)點(diǎn):
- 依賴不可變(可聲明
final字段)。 - 便于單元測(cè)試(無(wú)需反射)。
- 避免循環(huán)依賴(Spring 能檢測(cè)構(gòu)造器循環(huán)依賴并報(bào)錯(cuò))。
示例:
@Component
public class UserService {
private final UserDao userDao;
private final LogService logService;
// 無(wú)需 @Autowired,Spring 4.3+ 自動(dòng)推斷
public UserService(UserDao userDao, LogService logService) {
this.userDao = userDao;
this.logService = logService;
}
}最佳實(shí)踐建議
優(yōu)先使用構(gòu)造器注入:對(duì)于必需依賴,使用構(gòu)造器并盡量省略 @Autowired(Spring 4.3+)。
避免字段注入:它會(huì)使代碼難以單元測(cè)試,且違反單一職責(zé)(依賴過(guò)多不易察覺(jué))。
明確使用 @Qualifier:當(dāng)存在歧義時(shí),明確指定名稱,避免隱式依賴。
利用 @Primary:為最常用的實(shí)現(xiàn)類標(biāo)記為 @Primary,減少重復(fù) @Qualifier。
結(jié)合 Lombok:使用 @RequiredArgsConstructor 自動(dòng)生成構(gòu)造器,簡(jiǎn)化代碼。
總結(jié)
- XML 自動(dòng)注入:?
?autowire="byType/byName"?? - 注解自動(dòng)注入:?
?@Autowired??(企業(yè)首選) - 多個(gè)同類型 Bean:用 ?
?@Qualifier?? 指定名字
到此這篇關(guān)于一文淺析如何在Spring中配置自動(dòng)注入的文章就介紹到這了,更多相關(guān)Spring配置自動(dòng)注入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+Spring Security+JWT實(shí)現(xiàn)RESTful Api權(quán)限控制的方法
這篇文章主要介紹了SpringBoot+Spring Security+JWT實(shí)現(xiàn)RESTful Api權(quán)限控制的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Java獲取當(dāng)前時(shí)間String類型和Date類型方式
這篇文章主要介紹了Java獲取當(dāng)前時(shí)間String類型和Date類型方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-07-07
Java數(shù)據(jù)類型與運(yùn)算符詳細(xì)代碼示例
變量指的是程序運(yùn)行時(shí)可變的量,相當(dāng)于開(kāi)辟一塊內(nèi)存空間來(lái)保存一些數(shù)據(jù),類型則是對(duì)變量的種類進(jìn)行了劃分,不同的類型的變量具有不同的特性,這篇文章主要介紹了Java數(shù)據(jù)類型與運(yùn)算符的相關(guān)資料,需要的朋友可以參考下2026-02-02
spring boot集成rabbitmq的實(shí)例教程
這篇文章主要給大家介紹了關(guān)于spring boot集成rabbitmq的相關(guān)資料,springboot集成RabbitMQ非常簡(jiǎn)單,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-11-11
詳解如何將已有項(xiàng)目改造為Spring Boot項(xiàng)目
本篇文章主要介紹了如何將已有項(xiàng)目改造為Spring Boot項(xiàng)目,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
SpringBoot項(xiàng)目中Druid自動(dòng)登錄功能實(shí)現(xiàn)
Druid是Java語(yǔ)言中最好的數(shù)據(jù)庫(kù)連接池,Druid能夠提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,這篇文章主要介紹了SpringBoot項(xiàng)目中Druid自動(dòng)登錄功能實(shí)現(xiàn),需要的朋友可以參考下2024-08-08
springBoot整合rabbitmq測(cè)試常用模型小結(jié)
這篇文章主要介紹了springBoot整合rabbitmq并測(cè)試五種常用模型,本文主要針對(duì)前五種常用模型,在spirngboot框架的基礎(chǔ)上整合rabbitmq并進(jìn)行測(cè)試使用,需要的朋友可以參考下2022-01-01

