自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

private final、@Autowired、@Resource你更喜歡哪個(gè)?

開(kāi)發(fā) 前端
CommonAnnotationBeanPostProcessor?使用了Java的反射機(jī)制來(lái)解析注解,并通過(guò) javax.annotation.Resource?規(guī)范中定義的算法來(lái)查找匹配的依賴(lài)。根據(jù)規(guī)范,@Resource?注解默認(rèn)按照字段或方法參數(shù)的名稱(chēng)進(jìn)行依賴(lài)的匹配,也可以通過(guò) name屬性指定特定的依賴(lài)名稱(chēng)。

一、引言

現(xiàn)在有一些流言,想必大多都是非Java程序員對(duì)Java程序員的稱(chēng)謂或者嘲諷:“spring boy”。

相信現(xiàn)在大家基本上都是使用的基于spring或者SpringBoot框架構(gòu)建公司的各種業(yè)務(wù)應(yīng)用,這個(gè)稱(chēng)謂對(duì)我們來(lái)說(shuō)也沒(méi)有啥了。

不過(guò)就有一種嘲諷的意思是脫離了Spring我們就不能開(kāi)發(fā)了。

不知道大家是什么感受,不過(guò)了不起不以為然,沒(méi)了spring就自己定義一套處理流程...

不過(guò)目前了不起也還是使用spring生態(tài),今天有個(gè)項(xiàng)目中出現(xiàn)了三種注入bean的方式,@Resource、@Autowired、private final,我們一起來(lái)看一看吧。

二、Bean的注入

這里是一個(gè)簡(jiǎn)單的示例代碼,演示了 @Resource、@Autowired和 private final三種注入方式的使用:

publicclassMyService{
@Resource
private MyDependency resourceDependency;

@Autowired
private MyDependency autowiredDependency;

privatefinal MyDependency finalDependency;

publicMyService(MyDependency finalDependency){
this.finalDependency = finalDependency;
    }
  
// ...
}

publicclassMyDependency{
// ...
}

在上面的示例中,MyService類(lèi)使用了三種不同的方式來(lái)注入 MyDependency依賴(lài)。

@Resource和 @Autowired注解用于注入可變的依賴(lài),而 private final方式用于注入不可變的依賴(lài)。

這三種方式都是目前注入bean的方式,也常被面試官提及發(fā)問(wèn),不管你使用哪種方式,都是可以的。

三、@Resource

@Resource的原理:@Resource注解是Java標(biāo)準(zhǔn)庫(kù)提供的一種依賴(lài)注入方式。

在Spring中,@Resource注解的處理由 CommonAnnotationBeanPostProcessor類(lèi)負(fù)責(zé)。

該類(lèi)是一個(gè)Bean后置處理器,用于處理使用了 @Resource注解的字段或方法參數(shù)。

CommonAnnotationBeanPostProcessor在Spring的容器初始化過(guò)程中起作用,它會(huì)掃描所有的Bean定義,并檢查是否存在使用了 @Resource注解的字段或方法參數(shù)。

當(dāng)檢測(cè)到這樣的注解時(shí),它會(huì)解析注解中指定的名稱(chēng)(name),并嘗試查找匹配的依賴(lài)。

具體地說(shuō),CommonAnnotationBeanPostProcessor使用了Java的反射機(jī)制來(lái)解析注解,并通過(guò) javax.annotation.Resource規(guī)范中定義的算法來(lái)查找匹配的依賴(lài)。根據(jù)規(guī)范,@Resource注解默認(rèn)按照字段或方法參數(shù)的名稱(chēng)進(jìn)行依賴(lài)的匹配,也可以通過(guò) name屬性指定特定的依賴(lài)名稱(chēng)。

@Resource的使用方式:@Resource注解可以用于字段、方法和構(gòu)造函數(shù)上,用于指定要注入的依賴(lài)。下面是幾種常見(jiàn)的使用方式:

  • 字段注入:
publicclassMyService{
@Resource
private MyDependency dependency;
// ...
}
  • 方法注入:
publicclassMyService{
private MyDependency dependency;

@Resource
publicvoidsetDependency(MyDependency dependency){
this.dependency = dependency;
    }
// ...
}
  • 構(gòu)造函數(shù)注入:
publicclassMyService{
private MyDependency dependency;

@Resource
publicMyService(MyDependency dependency){
this.dependency = dependency;
    }
// ...
}

在上述示例中,@Resource注解用于標(biāo)記要注入的依賴(lài),并根據(jù)默認(rèn)的名稱(chēng)匹配規(guī)則或顯式指定的名稱(chēng)來(lái)查找依賴(lài)。

需要注意的是,@Resource注解是Java標(biāo)準(zhǔn)庫(kù)中的注解,因此它可以與Java SE和Java EE應(yīng)用程序一起使用,不僅限于Spring框架。

總結(jié)起來(lái),@Resource注解是Java標(biāo)準(zhǔn)庫(kù)提供的一種依賴(lài)注入方式,在Spring中借助 CommonAnnotationBeanPostProcessor來(lái)實(shí)現(xiàn)。它可以用于標(biāo)記要注入的依賴(lài),并根據(jù)名稱(chēng)匹配規(guī)則或顯式指定的名稱(chēng)來(lái)查找依賴(lài)。

四、@Autowired

當(dāng)涉及到 @Autowired注解的原理、使用方式以及與 @Resource注解的區(qū)別時(shí),我們需要了解它在Spring中的實(shí)現(xiàn)方式。下面我將詳細(xì)解釋 @Autowired的原理、使用方式以及與 @Resource注解的區(qū)別。

@Autowired的原理:

@Autowired注解是Spring Framework提供的一種依賴(lài)注入方式。它通過(guò) AutowiredAnnotationBeanPostProcessor類(lèi)來(lái)實(shí)現(xiàn)。AutowiredAnnotationBeanPostProcessor是一個(gè)Bean后置處理器,用于處理使用了 @Autowired注解的字段、方法或構(gòu)造函數(shù)參數(shù)。

在Spring的容器初始化過(guò)程中,AutowiredAnnotationBeanPostProcessor會(huì)掃描所有的Bean定義,檢查是否存在使用了 @Autowired注解的字段、方法或構(gòu)造函數(shù)參數(shù)。當(dāng)檢測(cè)到這樣的注解時(shí),它會(huì)解析注解,并根據(jù)依賴(lài)的類(lèi)型來(lái)尋找匹配的Bean,并將其注入到目標(biāo)對(duì)象中。

具體來(lái)說(shuō),AutowiredAnnotationBeanPostProcessor使用了Java的反射機(jī)制來(lái)解析 @Autowired注解,并利用Spring容器中的Bean定義信息來(lái)查找匹配的依賴(lài)。它支持按照類(lèi)型、名稱(chēng)和限定符等方式進(jìn)行依賴(lài)的解析和注入。

@Autowired的使用方式:

@Autowired注解可以用于字段、方法和構(gòu)造函數(shù)上,用于指定要注入的依賴(lài)。下面是幾種常見(jiàn)的使用方式:

  • 字段注入:
public class MyService {
    @Autowired
    private MyDependency dependency;
    // ...
}
```
  • 方法注入:
public class MyService {
    private MyDependency dependency;

    @Autowired
    public void setDependency(MyDependency dependency) {
        this.dependency = dependency;
    }
    // ...
}
```
  • 構(gòu)造函數(shù)注入:
public class MyService {
    private MyDependency dependency;

    @Autowired
    public MyService(MyDependency dependency) {
        this.dependency = dependency;
    }
    // ...
}
```

在上述示例中,@Autowired注解用于標(biāo)記要注入的依賴(lài)。Spring會(huì)根據(jù)依賴(lài)的類(lèi)型(或名稱(chēng)和限定符)自動(dòng)查找匹配的Bean,并將其注入到目標(biāo)對(duì)象中。

@Autowired與@Resource的區(qū)別:

盡管 @Autowired和 @Resource都是用于依賴(lài)注入的注解,但它們?cè)谝恍┓矫嬗幸恍﹨^(qū)別。

  1. 來(lái)源和依賴(lài)關(guān)系:@Autowired是Spring特有的注解,用于實(shí)現(xiàn)Spring的依賴(lài)注入機(jī)制。它通過(guò)類(lèi)型匹配來(lái)解析依賴(lài)關(guān)系。而 @Resource是Java標(biāo)準(zhǔn)庫(kù)中的注解,它可以與Java SE和Java EE應(yīng)用程序一起使用,不僅限于Spring框架。@Resource通過(guò)名稱(chēng)匹配來(lái)解析依賴(lài)關(guān)系。
  2. 配置方式:@Autowired注解通常與 @Component、@Service等Spring注解一起使用,通過(guò)組件掃描和自動(dòng)裝配來(lái)實(shí)現(xiàn)依賴(lài)注入。而 @Resource注解不需要特定的配置,它可以直接用于字段、方法和構(gòu)造函數(shù)上。
  3. 名稱(chēng)匹配規(guī)則:@Autowired注解默認(rèn)按照類(lèi)型進(jìn)行依賴(lài)的匹配。如果存在多個(gè)匹配的Bean,可以使用 @Qualifier注解指定特定的Bean名稱(chēng)或限定符。而 @Resource注解默認(rèn)按照名稱(chēng)進(jìn)行依賴(lài)的匹配,也可以通過(guò) name屬性指定特定的依賴(lài)名稱(chēng)。
  4. 兼容性:由于 @Resource是Java標(biāo)準(zhǔn)庫(kù)中的注解,因此它可以與Java SE和Java EE應(yīng)用程序一起使用,并且在不同的容器中具有較好的兼容性。相比之下,@Autowired注解是Spring特有的注解,主要用于Spring框架中,因此在非Spring環(huán)境中可能無(wú)法正常使用。
  5. Null處理:當(dāng)無(wú)法找到匹配的依賴(lài)時(shí),@Autowired注解的字段或方法參數(shù)可以為 null,而 @Resource注解要求必須找到匹配的依賴(lài),否則會(huì)拋出異常。

需要注意的是,盡管 @Autowired和 @Resource有一些區(qū)別,但在大多數(shù)情況下,它們可以互換使用。

如果您只是簡(jiǎn)單地進(jìn)行依賴(lài)注入,并且不需要關(guān)注兼容性問(wèn)題,那么兩者的選擇取決于個(gè)人偏好。

五、priavet final

private final字段的自動(dòng)注入原理:

在Spring Boot中,對(duì)于 private final字段的自動(dòng)注入,Spring使用構(gòu)造函數(shù)注入(Constructor Injection)來(lái)實(shí)現(xiàn)。當(dāng)一個(gè)Bean有一個(gè)或多個(gè) private final字段需要注入時(shí),Spring會(huì)嘗試在容器中查找與這些字段類(lèi)型匹配的Bean,并使用構(gòu)造函數(shù)注入來(lái)實(shí)例化Bean對(duì)象。

構(gòu)造函數(shù)注入的原理是,Spring會(huì)查找與構(gòu)造函數(shù)參數(shù)類(lèi)型匹配的Bean,并將它們作為參數(shù)傳遞給構(gòu)造函數(shù),從而實(shí)現(xiàn)對(duì) private final字段的賦值。

private final字段的使用方式:

在使用 private final字段進(jìn)行自動(dòng)注入時(shí),需要遵循以下幾個(gè)步驟:

  1. 定義一個(gè)帶有private final字段的類(lèi),并確保該類(lèi)是一個(gè)Spring Bean。
@Component
public class MyService {
    private final MyDependency dependency;

    public MyService(MyDependency dependency) {
        this.dependency = dependency;
    }

    // ...
}
```
  1. 在類(lèi)的構(gòu)造函數(shù)中接收依賴(lài)參數(shù),并將其賦值給 private final字段。
  2. Spring Boot會(huì)自動(dòng)掃描并創(chuàng)建Bean實(shí)例,同時(shí)檢測(cè)到帶有 private final字段的構(gòu)造函數(shù),會(huì)自動(dòng)解析依賴(lài)并進(jìn)行注入。

需要注意的是,由于 private final字段是不可變的,一旦注入后就無(wú)法修改。這種不可變性有助于確保字段的安全性和線程安全性。

六、總結(jié)

了不起和大家聊的springBean三種注入方式大家都爛熟于心了,具體使用還是看個(gè)人喜好,并無(wú)優(yōu)劣之分。

責(zé)任編輯:武曉燕 來(lái)源: Java面試教程
相關(guān)推薦

2010-07-30 13:58:01

命令行GUI

2022-09-27 07:31:57

Property模式數(shù)據(jù)

2021-07-09 14:26:11

KotlinLogo設(shè)計(jì)

2012-05-04 14:09:30

JavaScript

2020-02-10 10:05:12

Linux發(fā)行版Ubuntu

2016-01-11 11:56:14

jQueryAngularJS

2022-08-29 07:05:02

JSRJava語(yǔ)言

2021-12-02 09:04:05

布局問(wèn)題文字對(duì)齊圖片設(shè)計(jì)

2024-11-05 09:42:59

開(kāi)發(fā)軟件命令行

2018-01-31 14:20:36

Linux分區(qū)管理fdisk

2022-04-18 07:53:26

圣杯布局雙飛翼布局淘寶

2012-05-29 09:30:10

Windows Pho

2024-08-19 08:16:57

@Resource@AutowiredSpring

2023-02-17 08:02:45

@Autowired@Resource

2022-05-16 15:17:11

區(qū)塊鏈安全加密貨幣

2016-03-10 14:48:10

FedoraKorora 23Linux

2024-07-31 09:01:05

VSCode主題Dracula

2023-07-04 16:28:23

2020-09-08 13:45:37

Python工具包代碼
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)