@Autowire @Resource 的區別
1.來源不同:其中 @Autowire 是 Spring2.5 定義的注解,而 @Resource 是 Java 定義的注解
2.依賴查找的順序不同:
依賴注入的功能,是通過先在 Spring IoC 容器中查找對象,再將對象注入引入到當前類中。而查找又分為兩種方式:按名稱(byName)或按照類型(byType)查找,其中 @Autowire @Resource 都可以使用名稱查詢、類型查詢,但是區別在于二者進行查找的順序截然不同。
2.1 @Autowire
@Autowire 注解在查找要注入的 bean 時,首先會按照類型進行匹配,如果有多個匹配的 bean,就會按照名稱進行匹配。
具體來說,如果唄注入的屬性或構造函數參數的類型在容器中有且只有一個對應的 bean,那么 @Autowire 注解就會直接將該 bean 注入到該屬性或構造函數參數中。例如:
@Autowired
private UserService userService;
在這個例子中,如果容器中只有一個類型為 UserService 的 bean ,那么它就會被自動注入到userService 屬性中。
但是,如果容器中存在多個類型為 UserService 的 bean,就需要通過名稱進行匹配。此時,可以在 @Autowired 注解中使用 @Qualifier注解來指定要注入的bean的名稱,如果不使用 @Qualifier 注解就會使用屬性名。
例如:
@Autowired
@Qualifier("userService2")
private UserService userService;
在這個例子中,如果容器中有多個類型為 UserService 的 bean,那么它會根據 @Qualifier 注解中指定的名稱來匹配要注入的 bean。如果找到了名為 “userService2” 的 bean,就會將它注入到 userService 屬性中
這就是多個在實現有多個實現的 bean 注入的時候指定具體的 bean 的方式
2.2 @Resource注解
在Spring中,@Resource注解可以通過名稱或者類型來注入bean,具體取決于@Resource注解的兩個屬性:name和type。
如果@Resource注解中指定了name屬性,Spring將會根據該名稱來查找對應的bean,并將其注入到被注解的屬性或者方法參數中。例如:
@Resource(name = "myBean")
private MyBean myBean;
上述代碼將會根據名稱“myBean”來查找對應的bean,并將其注入到myBean屬性中。
如果@Resource注解沒有指定name屬性,而是指定了type屬性,Spring將會根據該類型來查找對應的bean,并將其注入到被注解的屬性或者方法參數中。例如:
@Resource(type = MyBean.class)
private MyBean myBean;
上述代碼將會根據類型MyBean來查找對應的bean,并將其注入到myBean屬性中。
如果@Resource注解既沒有指定name屬性,也沒有指定type屬性,那么它會默認按照名稱來查找對應的bean,并將其注入到被注解的屬性或者方法參數中。
3. 支持的參數不同:
@Autowired 和 @Resource 在使用時都可以設置參數,但二者支持的參數以及參數的個數完全不同,其中 @Autowired 只支持設置一個 required 的參數,而 @Resource 支持 7 個參數,支持的參數如下圖所示:
4. 依賴注入的用法支持不同
@Autowired 和 @Resource 支持依賴注入的用法不同,常見依賴注入有以下 3 種實現:
1.屬性注入
2.構造方法注入
3.Setter 注入
@Autowired 支持屬性注入、構造方法注入和 Setter 注入,而 @Resource 只支持屬性注入和 Setter 注入
?
小結:
在使用 Spring 框架要實現區分多個 bean 的注入時,可以使用 @Autowired 配合 @Qualifier(“bean的名字”) 的形式去實現注入不同的 bean