Java Spring的依賴注入理解及@Autowired用法示例詳解
一、什么是依賴注入(DI)?
1. 定義
依賴注入(Dependency Injection) 是 Spring 框架的核心功能之一,它指的是:
由 Spring 容器來管理對象之間的依賴關(guān)系,并自動將依賴對象注入到目標(biāo)對象中。
2. 舉個例子
比如:
public class BookService { private BookDao bookDao; }
這里 BookService
依賴于 BookDao
,如果手動創(chuàng)建:
BookDao bookDao = new BookDaoImpl(); BookService service = new BookService(bookDao);
而使用 Spring 后,你只需要告訴 Spring:
“我需要一個
BookDao
,你幫我自動注入進(jìn)來。”
Spring 會自動完成這個過程。
二、依賴注入的幾種方式
1. 構(gòu)造器注入(Constructor Injection)
public class BookService { private final BookDao bookDao; public BookService(BookDao bookDao) { this.bookDao = bookDao; } }
2. Setter 注入(Setter Injection)
public class BookService { private BookDao bookDao; public void setBookDao(BookDao bookDao) { this.bookDao = bookDao; } }
3. 字段注入(Field Injection)—— 使用@Autowired
public class BookService { @Autowired private BookDao bookDao; }
?? 注意:字段注入雖然方便,但不利于測試和維護(hù),推薦使用構(gòu)造器注入。
三、@Autowired和@Value的區(qū)別
注解 | 用途 | 注入類型 |
---|---|---|
@Autowired | 注入 Spring 容器中的 Bean 對象 | 引用類型(如 Bean) |
@Value | 注入基本類型、字符串、SpEL 表達(dá)式 | 簡單類型(如 String、int) |
示例:
? 引用類型注入(用@Autowired)
public class BookService { @Autowired private BookDao bookDao; // 注入一個 Bean }
? 簡單類型注入(用@Value)
public class AppConfig { @Value("com.mysql.jdbc.Driver") private String driver; }
四、在@Bean方法中如何注入依賴?
你提到的這段代碼:
@Bean public DataSource dataSource(BookDao bookDao) { // 引用類型直接添加形參 ... }
說明:
- 這是 基于 Java 配置類 的方式定義 Bean。
- Spring 會自動將
BookDao
類型的 Bean 注入進(jìn)來。 - 不需要再寫
@Autowired
,因?yàn)?Spring 會自動根據(jù)類型進(jìn)行裝配。
五、總結(jié)
問題 | 回答 |
---|---|
什么是依賴注入? | Spring 自動幫你把需要的對象注入進(jìn)來 |
怎么使用? | 構(gòu)造器、Setter、字段注入(@Autowired ) |
@Autowired 是干嘛的? | 注入引用類型(Bean) |
@Value 是干嘛的? | 注入簡單類型(字符串、數(shù)字等) |
為什么 @Bean 方法里可以直接加形參? | Spring 會根據(jù)類型自動裝配 |
@Autowired 這里不能用嗎? | 在 @Bean 方法參數(shù)中不需要,因?yàn)?Spring 自動裝配了 |
方法參數(shù)注入和@Autowired注入?yún)^(qū)別
- 方法參數(shù)注入:用于在某個方法內(nèi)部臨時(shí)使用一個 Bean,比如定義
@Bean
。@Autowired
字段注入:用于把 Bean 綁定到類中,整個類都可以用。
? 兩種引用類型依賴注入方式對比
方式 | 注解 | 使用位置 | 說明 | 示例 |
---|---|---|---|---|
構(gòu)造器/方法參數(shù)注入 | 無(Spring 自動裝配) | @Bean 方法參數(shù) / 構(gòu)造器參數(shù) | Spring 會根據(jù)類型自動將依賴注入到方法參數(shù)中 | public DataSource dataSource(BookDao bookDao) |
字段注入 / 成員變量注入 | @Autowired | 類成員變量 | Spring 會自動將 Bean 注入到字段上 | @Autowired private BookDao bookDao; |
?? 通俗理解
1.方法參數(shù)注入(如@Bean方法中)
@Bean public DataSource dataSource(BookDao bookDao) { ... }
- Spring 會自動把已經(jīng)注冊的
BookDao
Bean 注入到這個方法參數(shù)中。 - 這是一種 臨時(shí)使用依賴 的方式,適合在配置類中定義 Bean 時(shí)使用。
- 不需要
@Autowired
,Spring 會自動完成注入。
2.字段注入(使用@Autowired)
@Component public class BookService { @Autowired private BookDao bookDao; }
- 這是 把依賴綁定到類本身,類的整個生命周期都可以使用這個依賴。
- 適用于業(yè)務(wù)組件、Service、Controller 等類中。
- 必須使用
@Autowired
來告訴 Spring 要注入什么。
到此這篇關(guān)于Java Spring的依賴注入理解及@Autowired用法示例詳解的文章就介紹到這了,更多相關(guān)spring依賴注入內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud?OpenFeign?服務(wù)調(diào)用傳遞?token的場景分析
這篇文章主要介紹了SpringCloud?OpenFeign?服務(wù)調(diào)用傳遞?token的場景分析,本篇文章簡單介紹?OpenFeign?調(diào)用傳遞?header?,以及多線程環(huán)境下可能會出現(xiàn)的問題,其中涉及到?ThreadLocal?的相關(guān)知識,需要的朋友可以參考下2022-07-07springboot加載一個properties文件轉(zhuǎn)換為map方式
這篇文章主要介紹了springboot加載一個properties文件轉(zhuǎn)換為map方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07spring mvc4.1.6 spring4.1.6 hibernate4.3.11 mysql5.5.25開發(fā)環(huán)境搭
這篇文章主要介紹了spring mvc4.1.6 + spring4.1.6 + hibernate4.3.11+mysql5.5.25開發(fā)環(huán)境搭建圖文教程,需要的朋友可以參考下2016-06-06