最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Springboot @Autowired和@Resource的區(qū)別解析

 更新時(shí)間:2025年04月03日 15:02:11   作者:fixAllenSun  
@Resource是JDK 提供的注解,只是Spring 在實(shí)現(xiàn)上提供了這個(gè)注解的功能支持,本文給大家介紹Springboot @Autowired和@Resource的區(qū)別,感興趣的朋友一起看看吧

【一】定義

@Resource 和@Autowired 這兩個(gè)注解的作用都是在Spring 生態(tài)里面去實(shí)現(xiàn)Bean 的依賴(lài)注入。

【1】@Autowired

對(duì)類(lèi)成員變量、方法和構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作

【2】@Resource

在語(yǔ)義上被定義為通過(guò)唯一的名稱(chēng)來(lái)標(biāo)識(shí)特定的目標(biāo)組件,其中聲明的類(lèi)型與匹配過(guò)程無(wú)關(guān)

【二】區(qū)別

在spring框架中,如果在service層需要注入其他依賴(lài)的對(duì)象,通常我們都會(huì)使用@Autowired或者@Resource注解。@Autowired跟Spring框架強(qiáng)耦合了,如果換成其他的框架,@Autowired就沒(méi)有作用了,而@Resource是JSR-250提供的,它是Java標(biāo)準(zhǔn),絕大部分框架都支持

【1】包含的屬性不同

(1)@Autowired只包含一個(gè)參數(shù):required,表示是否開(kāi)啟自動(dòng)注入,默認(rèn)是true。
(2)@Resource包含七個(gè)參數(shù):其中最重要的兩個(gè)參數(shù)是:name和type。

public @interface Autowired {
  //是否開(kāi)啟自動(dòng)注入,有些時(shí)候我們不想使用自動(dòng)裝配功能,可以將該參數(shù)設(shè)置成false。
	boolean required() default true;
}
public @interface Resource {
		//bean的名稱(chēng)
    String name() default "";
    String lookup() default "";
 		//Java類(lèi),被解析為bean的類(lèi)型
    Class<?> type() default java.lang.Object.class;
    enum AuthenticationType {
            CONTAINER,
            APPLICATION
    }
    // 身份驗(yàn)證類(lèi)型
    AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
    //組件是否可以與其他組件之間共享
    boolean shareable() default true;
    String mappedName() default "";
    //描述
    String description() default "";
}

【2】@Autowired默認(rèn)按byType自動(dòng)裝配,而@Resource默認(rèn)byName自動(dòng)裝配

@Autowired如果要使用byName,需要使用@Qualifier一起配合,而@Resource如果指定了name,則用byName自動(dòng)裝配,如果指定了type,則用byType自動(dòng)裝配

【3】注解應(yīng)用的地方不同

@Autowired能夠用在:構(gòu)造器、方法、參數(shù)、成員變量和注解上,二@Resource能用在:類(lèi)、成員變量、方法上

【4】出處不同

@Autowired是Spring定義的注解,而@Resource是JSR-250定義的注解,所以@Autowired只能在spring框架下使用,而@Resource則可以和其他框架一起使用

【5】裝配順序不用

(1)@Autowired的裝配順序如下

@Autowired默認(rèn)先按byType進(jìn)行匹配,如果發(fā)現(xiàn)找到多個(gè)bean,則又按照byName方式進(jìn)行匹配,如果還有多個(gè),則報(bào)出異常。

(2)@Resource的裝配順序如下

(1)如果同時(shí)指定了name和type,流程如下:

(2)如果指定了name,流程如下:
只是指定了@Resource注解的name,則按name后的名字去bean元素里查找有與之相等的name屬性的bean。

(3)如果指定了type,流程如下:
只指定@Resource注解的type屬性,則從上下文中找到類(lèi)型匹配的唯一bean進(jìn)行裝配,找不到或者找到多個(gè),都會(huì)拋出異常。

(4)如果既沒(méi)有指定name,也沒(méi)有指定type,流程如下:
既不指定name屬性,也不指定type屬性,則自動(dòng)按byName方式進(jìn)行查找。如果沒(méi)有找到符合的bean,則回退為一個(gè)原始類(lèi)型進(jìn)行進(jìn)行查找,如果找到就注入。

【三】@Autowired使用案例

(1)參數(shù)

@Autowired 注解里面有一個(gè) required 屬性默認(rèn)值是 true,表示強(qiáng)制要求bean實(shí)例的注入, 在應(yīng)用啟動(dòng)的時(shí)候,如果 IOC 容器里面不存在對(duì)應(yīng)類(lèi)型的Bean,就會(huì)報(bào)錯(cuò)。當(dāng)然,如果不希望自動(dòng)注入,可以把這個(gè)屬性設(shè)置成 false。

(2)取bean邏輯

如果在容器中有多個(gè)相同類(lèi)型的Bean,使用@Autowired注入Bean,則去找名稱(chēng)和注入屬性的屬性名相同的Bean,如果能找到唯一的,則注入成功,否則應(yīng)用啟動(dòng)的時(shí)候就會(huì)報(bào)錯(cuò),大概意思是指注入只需要一個(gè)Bean實(shí)例,但在容器中找到了多個(gè)(容器不知道該注入那個(gè)Bean)。為了解決問(wèn)題,需要配合@Qualifier注解使用。@Qualifier注解可以從多個(gè)相同類(lèi)型的Bean里篩選出一個(gè)Bean名稱(chēng)和@Qualifier注解的value屬性相同的Bean。如果容器中恰好找到一個(gè)這樣的Bean,則應(yīng)用啟動(dòng)的時(shí)候成功注入這個(gè)Bean實(shí)例。同樣的,當(dāng)有多個(gè)同類(lèi)型的Bean時(shí),@Parimary標(biāo)注的Bean作為主要的Bean會(huì)被優(yōu)先注入。

(3)只使用@Autowired注解,InjectTestController注入InjectTestService

/* InjectTestController注入InjectTestService,此時(shí)容器中
有兩個(gè)InjectTestService類(lèi)型的Bean(injectTestService,injectTestServiceImpl)。
因?yàn)樽⑷雽傩缘膶傩悦麨閕njectTestService,
容器中恰好存在一個(gè)名稱(chēng)為injectTestService的Bean,
所以名稱(chēng)為injectTestService的Bean可以成功注入到屬性injectTestService,
應(yīng)用啟動(dòng)不報(bào)錯(cuò)。*/
@Controller
public class InjectTestController {
    @Autowired
    private InjectTestService injectTestService;
}
@Configuration
public class BeanConfig {
   @Bean
   public InjectTestService injectTestService(){
       return new InjectTestServiceImpl();
   }
}
@Service
public class InjectTestServiceImpl implements InjectTestService {
}

(4)@Autowired注解和@Qualifier注解配合使用,InjectTestController注入InjectTestService

/* 容器中存在兩個(gè)類(lèi)型為InjectTestService的Bean(injectTestService,injectTestServiceImpl),
但經(jīng)過(guò)@Qualifier的value屬性篩選,找到了名稱(chēng)為injectTestServiceImpl的Bean,
因此可以成功注入到屬性service中 */
@Controller
public class InjectTestController {
    @Autowired
    @Qualifier("injectTestServiceImpl")
    private InjectTestService service;
}
@Configuration
public class BeanConfig {
   @Bean
   public InjectTestService injectTestService(){
       return new InjectTestServiceImpl();
   }
}
@Service
public class InjectTestServiceImpl implements InjectTestService {
}

(5)@Autowired注解和@Primary注解配合使用,InjectTestController注入InjectTestService

/* 容器中存在兩個(gè)類(lèi)型為InjectTestService的Bean(injectTestService,injectTestServiceImpl),
但@Primary注解指定名稱(chēng)為injectTestService的Bean為主Bean,在多個(gè)同類(lèi)型的Bean的時(shí)候會(huì)優(yōu)先注入
因此可以成功注入到屬性service中 */
@Controller
public class InjectTestController {
    @Autowired
    private InjectTestService service;
}
@Configuration
public class BeanConfig {
   @Bean
   @Primary
   public InjectTestService injectTestService(){
       return new InjectTestServiceImpl();
   }
}
@Service
public class InjectTestServiceImpl implements InjectTestService {
}

(6)@Resource

@Resource 是 JDK 提供的注解,只是 Spring 在實(shí)現(xiàn)上提供了這個(gè)注解的功能支持。 它的使用方式和@Autowired 完全相同,最大的差異于@Resource 可以支持ByName 和 ByType 兩種注入方式。 如果使用name,Spring就根據(jù)bean的名字實(shí)現(xiàn)依賴(lài)注入,如果使用type,Spring就根據(jù)類(lèi)型實(shí)現(xiàn)依賴(lài)注入。 如果兩個(gè)屬性都沒(méi)配置,就先根據(jù)定義的屬性名字去匹配,如果沒(méi)匹配成功,再根據(jù)類(lèi)型匹配。兩個(gè)都沒(méi)匹配到,就報(bào)錯(cuò)。

到此這篇關(guān)于Springboot @Autowired和@Resource的區(qū)別的文章就介紹到這了,更多相關(guān)Springboot @Autowired和@Resource的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA中sout快捷鍵無(wú)效問(wèn)題的解決方法

    IDEA中sout快捷鍵無(wú)效問(wèn)題的解決方法

    這篇文章主要介紹了IDEA中sout快捷鍵無(wú)效問(wèn)題,在類(lèi)文件中進(jìn)行操作會(huì)造成sout快捷命令無(wú)法自動(dòng)生成,比如操作了import引入其它包之后,本文給大家分享解決方法,感興趣的朋友一起看看吧
    2022-07-07
  • 詳解Java中StringBuffer類(lèi)常用方法

    詳解Java中StringBuffer類(lèi)常用方法

    這篇文章主要為大家介紹了java中StringBuffer類(lèi)常用方法
    2016-01-01
  • SpringBoot中使用@Async實(shí)現(xiàn)異步任務(wù)調(diào)用詳解

    SpringBoot中使用@Async實(shí)現(xiàn)異步任務(wù)調(diào)用詳解

    這篇文章主要介紹了SpringBoot中使用@Async實(shí)現(xiàn)異步任務(wù)調(diào)用詳解,一個(gè)可以無(wú)需等待被調(diào)用函數(shù)的返回值就讓操作繼續(xù)進(jìn)行的方法(來(lái)自百度百科),即程序在順序執(zhí)行時(shí),不等待異步調(diào)用的語(yǔ)句返回結(jié)果就執(zhí)行后面的程序,需要的朋友可以參考下
    2023-12-12
  • java字符緩沖流面試精講

    java字符緩沖流面試精講

    這篇文章主要為大家介紹了java中字符緩沖流面試精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • Java Chassis3注冊(cè)中心分區(qū)隔離技術(shù)解密

    Java Chassis3注冊(cè)中心分區(qū)隔離技術(shù)解密

    這篇文章主要為大家介紹了Java Chassis3注冊(cè)中心分區(qū)隔離技術(shù)解密,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • hibernate增刪改查操作代碼

    hibernate增刪改查操作代碼

    這篇文章主要介紹了hibernate增刪改查操作代碼,需要的朋友可以參考下
    2017-09-09
  • java中MultipartFile和File最簡(jiǎn)單的互相轉(zhuǎn)換示例

    java中MultipartFile和File最簡(jiǎn)單的互相轉(zhuǎn)換示例

    這篇文章主要給大家介紹了關(guān)于java中MultipartFile和File最簡(jiǎn)單的互相轉(zhuǎn)換的相關(guān)資料,MultipartFile和File都是Java中用于處理文件上傳的類(lèi),MultipartFile用于處理上傳的文件,File用于處理本地磁盤(pán)上的文件,需要的朋友可以參考下
    2023-09-09
  • Java Springboot的目的你知道嗎

    Java Springboot的目的你知道嗎

    在本篇文章中小編給大家分析了Java中Spring Boot的優(yōu)勢(shì)以及相關(guān)知識(shí)點(diǎn)內(nèi)容,興趣的朋友們可以學(xué)習(xí)參考下,希望能夠給你帶來(lái)幫助
    2021-09-09
  • Java Spring使用hutool的HttpRequest發(fā)送請(qǐng)求的幾種方式

    Java Spring使用hutool的HttpRequest發(fā)送請(qǐng)求的幾種方式

    文章介紹了Hutool庫(kù)中用于發(fā)送HTTP請(qǐng)求的工具,包括添加依賴(lài)、發(fā)送GET和POST請(qǐng)求的方法,以及GET請(qǐng)求的不同參數(shù)傳遞方式,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Mybatis-Plus中g(shù)etOne方法獲取最新一條數(shù)據(jù)的示例代碼

    Mybatis-Plus中g(shù)etOne方法獲取最新一條數(shù)據(jù)的示例代碼

    這篇文章主要介紹了Mybatis-Plus中g(shù)etOne方法獲取最新一條數(shù)據(jù),本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

瑞安市| 中牟县| 西宁市| 漳平市| 重庆市| 吉木萨尔县| 桂平市| 汕尾市| 镇江市| 任丘市| 新疆| 金堂县| 合作市| 来凤县| 萍乡市| 绥中县| 澜沧| 玉门市| 安顺市| 吉水县| 运城市| 皮山县| 修水县| 定兴县| 三原县| 武汉市| 阿合奇县| 阳东县| 元江| 海林市| 浦北县| 黑水县| 油尖旺区| 奉化市| 通城县| 饶阳县| 宣城市| 枣阳市| 泌阳县| 德州市| 常宁市|