Springboot Autowried及Resouce使用對比解析
在做項目時,發(fā)現(xiàn)項目中 加載類時,有的地方使用@Autowired,有的地方使用@Resource
在網(wǎng)上搜集了資料
共同點
@Resource和@Autowired都可以作為注入屬性的修飾,在接口僅有單一實現(xiàn)類時,兩個注解的修飾效果相同,可以互相替換,不影響使用。
不同點
@Resource是Java自己的注解,@Resource有兩個屬性是比較重要的,分是name和type;Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根據(jù)type進行注入,不會去匹配name。如果涉及到type無法辨別注入對象時,那需要依賴@Qualifier或@Primary注解一起來修飾。
寫列子
新建 HumanService.java類
package com.komiles.study.service;/** * @author komiles@163.com * @date 2020-03-23 11:46 */public interface HumanService { /** * 跑馬拉松 * @return */ String runMarathon();}
實現(xiàn)類 ManServiceImpl.java
package com.komiles.study.service.impl;import com.komiles.study.service.HumanService;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;/** * @author komiles@163.com * @date 2020-03-23 11:48 */@Servicepublic class ManServiceImpl implements HumanService { /** * 跑馬拉松 */ @Override public String runMarathon() { return ' A man run marathon'; }}
新建HumanController.java
package com.komiles.study.controller;import com.komiles.study.service.HumanService;import com.komiles.study.service.impl.ManServiceImpl;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * @author komiles@163.com * @date 2020-03-23 11:49 */@RestController@RequestMapping('/human')public class HumanController { @Autowired private HumanService humanService; @GetMapping('/run') public String runMarathon() { return humanService.runMarathon(); }}
運行程序
輸出內(nèi)容為: man run marathon
把controller里的 @Autowired 改成@Resource 也能正常訪問。
假如我寫多個實現(xiàn)類會怎么樣呢?
新建一個 WomanServiceImpl.java
package com.komiles.study.service.impl;import com.komiles.study.service.HumanService;import org.springframework.context.annotation.Primary;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;/** * @author komiles@163.com * @date 2020-03-23 12:01 */@Servicepublic class WomanServiceImpl implements HumanService { /** * 跑馬拉松 */ @Override public String runMarathon() { return 'A Woman run marathon'; }}
運行程序,發(fā)現(xiàn)報錯了,因為有兩個實現(xiàn)類,程序不知道找那個了
怎么辦呢?
有兩種辦法
第一種,在實現(xiàn)類中給類起名字,在引入的時候直接引入名字。
例如:在ManServiceImpl.java類,@Service上加值。@Service(value = 'manService') 或者 @Component(value = 'manService')
package com.komiles.study.service.impl;import com.komiles.study.service.HumanService;import org.springframework.stereotype.Component;import org.springframework.stereotype.Service;/** * @author komiles@163.com * @date 2020-03-23 11:48 */@Service(value = 'manService')//@Component(value = 'manService')public class ManServiceImpl implements HumanService { /** * 跑馬拉松 */ @Override public String runMarathon() { return ' A man run marathon'; }}
在Controller類中使用時,也需要制定一下名字。
如果使用@Resource 需要加上 @Resource(name='manService')
如果使用@Autowired 需要使用@Qualifier(value='manService')
package com.komiles.study.controller;import com.komiles.study.service.HumanService;import com.komiles.study.service.impl.ManServiceImpl;import javax.annotation.Resource;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;/** * @author komiles@163.com * @date 2020-03-23 11:49 */@RestController@RequestMapping('/human')public class HumanController { @Autowired @Qualifier(value = 'manService')// @Resource(name='manService') private HumanService humanService; @GetMapping('/run') public String runMarathon() { return humanService.runMarathon(); }}
如果想優(yōu)先引用某一個類,可以在實現(xiàn)類上使用 @Primary。
項目代碼:
https://github.com/KoMiles/springboot/blob/master/src/main/java/com/komiles/study/controller/HumanController.java
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Java GZip 基于內(nèi)存實現(xiàn)壓縮和解壓的方法2. Springboot 全局日期格式化處理的實現(xiàn)3. 利用CSS制作3D動畫4. .Net加密神器Eazfuscator.NET?2023.2?最新版使用教程5. jsp+servlet簡單實現(xiàn)上傳文件功能(保存目錄改進)6. JAMon(Java Application Monitor)備忘記7. 完美解決vue 中多個echarts圖表自適應(yīng)的問題8. SpringBoot+TestNG單元測試的實現(xiàn)9. 存儲于xml中需要的HTML轉(zhuǎn)義代碼10. idea配置jdk的操作方法
