Springboot Autowried及Resouce使用對(duì)比解析
在做項(xiàng)目時(shí),發(fā)現(xiàn)項(xiàng)目中 加載類(lèi)時(shí),有的地方使用@Autowired,有的地方使用@Resource
在網(wǎng)上搜集了資料
共同點(diǎn)
@Resource和@Autowired都可以作為注入屬性的修飾,在接口僅有單一實(shí)現(xiàn)類(lèi)時(shí),兩個(gè)注解的修飾效果相同,可以互相替換,不影響使用。
不同點(diǎn)
@Resource是Java自己的注解,@Resource有兩個(gè)屬性是比較重要的,分是name和type;Spring將@Resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類(lèi)型。所以如果使用name屬性,則使用byName的自動(dòng)注入策略,而使用type屬性時(shí)則使用byType自動(dòng)注入策略。如果既不指定name也不指定type屬性,這時(shí)將通過(guò)反射機(jī)制使用byName自動(dòng)注入策略。
@Autowired是spring的注解,是spring2.5版本引入的,Autowired只根據(jù)type進(jìn)行注入,不會(huì)去匹配name。如果涉及到type無(wú)法辨別注入對(duì)象時(shí),那需要依賴(lài)@Qualifier或@Primary注解一起來(lái)修飾。
寫(xiě)列子
新建 HumanService.java類(lèi)
package com.komiles.study.service;
/**
* @author komiles@163.com
* @date 2020-03-23 11:46
*/
public interface HumanService {
/**
* 跑馬拉松
* @return
*/
String runMarathon();
}
實(shí)現(xiàn)類(lèi) 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
*/
@Service
public 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();
}
}
運(yùn)行程序
輸出內(nèi)容為: man run marathon
把controller里的 @Autowired 改成@Resource 也能正常訪問(wèn)。
假如我寫(xiě)多個(gè)實(shí)現(xiàn)類(lèi)會(huì)怎么樣呢?
新建一個(gè) 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
*/
@Service
public class WomanServiceImpl implements HumanService {
/**
* 跑馬拉松
*/
@Override
public String runMarathon() {
return "A Woman run marathon";
}
}
運(yùn)行程序,發(fā)現(xiàn)報(bào)錯(cuò)了,因?yàn)橛袃蓚€(gè)實(shí)現(xiàn)類(lèi),程序不知道找那個(gè)了
怎么辦呢?
有兩種辦法
第一種,在實(shí)現(xiàn)類(lèi)中給類(lèi)起名字,在引入的時(shí)候直接引入名字。
例如:在ManServiceImpl.java類(lèi),@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類(lèi)中使用時(shí),也需要制定一下名字。
如果使用@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)先引用某一個(gè)類(lèi),可以在實(shí)現(xiàn)類(lèi)上使用 @Primary。
項(xiàng)目代碼:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- SpringBoot啟動(dòng)及自動(dòng)裝配原理過(guò)程詳解
- spring boot中的條件裝配bean的實(shí)現(xiàn)
- 詳解Spring Boot自動(dòng)裝配的方法步驟
- 深入淺析SpringBoot中的自動(dòng)裝配
- springboot對(duì)接支付寶支付接口(詳細(xì)開(kāi)發(fā)步驟總結(jié))
- SpringBoot配置Druid數(shù)據(jù)監(jiān)控代碼實(shí)例
- SpringBoot中使用Jsoup爬取網(wǎng)站數(shù)據(jù)的方法
- Springboot自動(dòng)裝配實(shí)現(xiàn)過(guò)程代碼實(shí)例
相關(guān)文章
SpringCloud Gateway鑒權(quán)和跨域解決方案
網(wǎng)關(guān)是介于客戶(hù)端和服務(wù)器端之間的中間層,所有的外部請(qǐng)求都會(huì)先經(jīng)過(guò) 網(wǎng)關(guān)這一層,也就是說(shuō),API 的實(shí)現(xiàn)方面更多的考慮業(yè)務(wù)邏輯,而安全、性能、監(jiān)控可以交由 網(wǎng)關(guān)來(lái)做,這樣既提高業(yè)務(wù)靈活性又不缺安全性,本文給大家介紹SpringCloud Gateway鑒權(quán)和跨域解決方案,一起看看吧2023-11-11
idea maven項(xiàng)目無(wú)法識(shí)別jar包里的class解決方案
這篇文章主要介紹了idea maven項(xiàng)目無(wú)法識(shí)別jar包里的class解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
mybatis查詢(xún)語(yǔ)句揭秘之封裝數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于mybatis查詢(xún)語(yǔ)句揭秘之封裝數(shù)據(jù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
Java面試高頻問(wèn)題之RabbitMQ系列全面解析
在介紹RabbitMQ之前實(shí)現(xiàn)要介紹一下MQ,MQ是什么?MQ全稱(chēng)是Message Queue,可以理解為消息隊(duì)列的意思,簡(jiǎn)單來(lái)說(shuō)就是消息以管道的方式進(jìn)行傳遞。RabbitMQ是一個(gè)實(shí)現(xiàn)了AMQP(Advanced Message Queuing Protocol)高級(jí)消息隊(duì)列協(xié)議的消息隊(duì)列服務(wù),用Erlang語(yǔ)言的2021-11-11
解決Aop @AfterReturning因返回類(lèi)型不一致導(dǎo)致無(wú)法執(zhí)行切面代碼
這篇文章主要介紹了解決Aop @AfterReturning因返回類(lèi)型不一致導(dǎo)致無(wú)法執(zhí)行切面代碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

