@AutoWired和@Resource的區別
這兩個我們在項目中,經常去使用。很少有人知道他們有什么區別。下面我們將從
- 來源
- 依賴查找順序
- 支持的參數
- 依賴注入的用法支持
這四個方面來說明他們倆個的區別
來源
@Autowired
: 這是Spring框架自帶的注解,用于實現自動依賴注入。@Resource
: 這是Java EE 5的注解,由JSR-250規范定義,也被Spring框架支持,用于實現JNDI查找和自動裝配。
依賴查找順序
@Autowired
: Spring容器在解析@Autowired
注解時,首先會按照類型進行匹配,如果存在多個相同類型的Bean,則會進一步根據名稱進行匹配。如果沒有明確指定名稱,Spring將拋出異常。
指定名字用的注解就是@Qualifier
@Resource
: 默認的注入順序是按照Bean的名稱進行匹配,如果找不到,則會按照類型進行匹配。如果仍然找不到,將不會拋出異常,而是返回null
。
支持的參數
@Autowired
: 支持多種參數,包括required
(是否必須)和primary
(是否首選)等。@Resource
: 支持name
屬性,可以通過它指定要注入的Bean的名稱。也支持type
屬性。可以根據類型查找對應的bean。
依賴注入的用法支持
@Autowired
: 支持屬性注入、構造方法注入和Setter注入@Resource
: 只支持屬性注入和Setter注入
額外補充
-
覆蓋性:
@Autowired
提供了更豐富的配置選項,如通過@Qualifier
注解來指定注入的具體Bean。 -
兼容性:
@Autowired
是Spring特有的,而@Resource
是Java EE的一部分,因此@Resource
在非Spring環境中也可能被使用。 -
使用場景:
@Autowired
通常用于Spring管理的Bean之間的依賴關系,而@Resource
可能用于那些同時需要兼容Java EE環境的場景。 -
性能考慮: 在某些情況下,
@Autowired
可能需要更多的解析工作,特別是在沒有明確指定Bean名稱時,而@Resource
則直接依賴于JNDI查找,可能在查找順序上更直接。 -
搜索范圍
@Autowired
在Spring的組件掃描中搜索Bean。@Resource
在JVM范圍內搜索資源,不限于Spring容器。
為什么idea推薦我們使用@Resource
當我們用@autowired的時候會有這樣的提示
@Autowired
private IFileService fileService;
他給出的原因是這樣的
下面給出一點我的見解。
- 使用
@Resource
可以提高代碼的兼容性,特別是在需要與Java EE環境交互時。 @Autowired
如果找不到匹配的Bean,會拋出一個異常,除非它使用了optional=true
參數。@Resource
如果找不到匹配的資源,不會拋出異常,而是將變量設置為null
所以說我認為推薦使用@Resource
而不是@Autowired
的情況:
- 兼容性:如果你的應用程序需要在Java EE環境中運行,或者需要與Java EE資源進行交互,使用
@Resource
可以提高代碼的兼容性。 - 默認行為:如果你更傾向于根據名稱進行資源的自動裝配,而不是類型,
@Resource
可能更符合你的需求。 - 避免異常:如果你希望在找不到匹配的資源時不拋出異常,而是將變量設置為
null
,@Resource
提供了這樣的行為。
不管是使用@autowired還是@resource 都是可以實現功能的,更多的還是看我們的編程習慣。