大家好,我是鋒哥。今天分享關于【Spring AutoWired與Resource區別?】面試題。希望對大家有幫助;
Spring AutoWired與Resource區別?
1000道 互聯網大廠Java工程師 精選面試題-Java資源分享網
在 Spring 中,@Autowired
和 @Resource
都是用于依賴注入(DI,Dependency Injection)的注解,它們的作用是將一個 Bean 自動注入到另一個 Bean 中。雖然它們的功能相似,但也存在一些差異。下面我們將詳細對比這兩者的不同之處。
1.?@Autowired
?注解
@Autowired
是 Spring 提供的注解,它可以自動將一個 Bean 注入到其他 Bean 中。它基于類型(默認)或名稱來注入依賴,具體行為可以通過不同的配置來定制。
使用方式:
@Component
public class Car {private Engine engine;@Autowiredpublic Car(Engine engine) { // 構造器注入this.engine = engine;}public Engine getEngine() {return engine;}
}
主要特點:
-
按類型注入:
@Autowired
默認是按類型(type)來進行注入的。Spring 會根據類型自動匹配合適的 Bean。如果有多個符合條件的 Bean,會根據配置的規則選擇一個。 -
構造器注入、字段注入和方法注入:
@Autowired
可以用在構造器、字段和 setter 方法上。 -
required
屬性:可以通過@Autowired(required=false)
來配置非必需的依賴,如果沒有找到匹配的 Bean,則不會拋出異常。示例:
@Autowired(required = false) // 不會拋出異常,如果沒有找到對應的 Bean private Engine engine;
-
與
@Primary
配合使用:如果有多個候選 Bean 可以注入,@Primary
注解可以指定默認的注入 Bean。
按名稱選擇注入:
如果要按名稱注入(比如某個 Bean 的名稱為 engine
),可以配合 @Qualifier
注解使用。
@Autowired
@Qualifier("specificEngine")
private Engine engine;
2.?@Resource
?注解
@Resource
是 Javax 提供的注解,并且它是 JSR-250 的一部分。它的功能與 @Autowired
類似,但其注入方式優先考慮 按名稱,其次按 類型 進行注入。
使用方式:
@Component
public class Car {@Resourceprivate Engine engine;
}
主要特點:
-
按名稱注入:
@Resource
優先按照 Bean 的名稱進行注入。如果沒有找到符合名稱的 Bean,Spring 會繼續根據類型進行注入。 -
name
屬性:可以顯式指定要注入的 Bean 的名稱。示例:
@Resource(name = "specificEngine") private Engine engine;
-
與
@Autowired
的區別:@Resource
注解具有明確的優先級,首先通過 Bean 的名稱來匹配,如果沒有找到匹配的 Bean,再按類型進行注入。因此,它在注入時會首先依賴名稱來進行匹配,而不是像@Autowired
默認的按類型注入。例如:
@Component public class Car {@Resource(name = "specificEngine")private Engine engine; }
如果
@Resource
找不到名稱為specificEngine
的 Bean,才會根據類型進行注入。
3.?@Autowired
?與?@Resource
?的主要區別
特性 | @Autowired | @Resource |
---|---|---|
注入方式 | 默認按類型注入;可以通過?@Qualifier ?按名稱指定 | 默認按名稱注入;如果找不到名稱,則按類型注入 |
優先級 | 按類型優先匹配;可以使用?@Qualifier ?精確匹配 | 按名稱優先匹配;其次按類型匹配 |
required ?屬性 | 可以設置?required = false ?控制是否為必填項 | 沒有?required ?屬性 |
支持的注入位置 | 支持構造器注入、字段注入、setter 方法注入 | 僅支持字段注入和 setter 方法注入 |
規范支持 | Spring 提供的注解 | JSR-250 ?規范的一部分 |
4.?實際應用中選擇使用?@Autowired
?或?@Resource
@Autowired
?更常用:由于?@Autowired
?是 Spring 框架提供的注解,默認按類型進行注入,因此在大多數情況下,它更加靈活且易于使用。使用時,通常搭配?@Qualifier
?精確指定注入的 Bean。@Resource
?適合 Java EE 規范要求的場景:@Resource
?是 JSR-250 規范的一部分,適用于那些需要遵循 Java EE 規范的項目,或者當你想明確按名稱注入時,使用?@Resource
?會更加直觀。
5.?代碼示例比較
使用?@Autowired
?按類型注入:
@Component
public class Car {@Autowiredprivate Engine engine; // 按類型注入 Engine 類型的 Bean
}
使用?@Resource
?按名稱注入:
@Component
public class Car {@Resource(name = "specificEngine")private Engine engine; // 按名稱注入名為 specificEngine 的 Bean
}
總結
@Autowired
:是 Spring 專有的注解,按類型注入 Bean,具有靈活的配置選項,適用于大多數 Spring 應用。@Resource
:是 JSR-250 規范的一部分,優先按名稱注入,如果沒有找到合適的名稱 Bean,則按類型注入,適合需要遵循 Java EE 規范的項目。
在實際開發中,@Autowired
是最常見的選擇,@Resource
更多用于與 Java EE 標準兼容的項目。