現(xiàn)在有一些流言,想必大多都是非Java程序員對(duì)Java程序員的稱謂或者嘲諷:“spring boy”。
相信現(xiàn)在大家基本上都是使用的基于spring或者SpringBoot框架構(gòu)建公司的各種業(yè)務(wù)應(yīng)用,這個(gè)稱謂對(duì)我們來說也沒有啥了。
不過就有一種嘲諷的意思是脫離了Spring我們就不能開發(fā)了。
不知道大家是什么感受,不過了不起不以為然,沒了spring就自己定義一套處理流程...
不過目前了不起也還是使用spring生態(tài),今天有個(gè)項(xiàng)目中出現(xiàn)了三種注入bean的方式,@Resource、@Autowired、private final,我們一起來看一看吧。
這里是一個(gè)簡(jiǎn)單的示例代碼,演示了 @Resource、@Autowired和 private final三種注入方式的使用:
publicclassMyService{@Resourceprivate MyDependency resourceDependency;@Autowiredprivate MyDependency autowiredDependency;privatefinal MyDependency finalDependency;publicMyService(MyDependency finalDependency){this.finalDependency = finalDependency; } // ...}publicclassMyDependency{// ...}
在上面的示例中,MyService類使用了三種不同的方式來注入 MyDependency依賴。
@Resource和 @Autowired注解用于注入可變的依賴,而 private final方式用于注入不可變的依賴。
這三種方式都是目前注入bean的方式,也常被面試官提及發(fā)問,不管你使用哪種方式,都是可以的。
@Resource的原理:@Resource注解是Java標(biāo)準(zhǔn)庫提供的一種依賴注入方式。
在Spring中,@Resource注解的處理由 CommonAnnotationBeanPostProcessor類負(fù)責(zé)。
該類是一個(gè)Bean后置處理器,用于處理使用了 @Resource注解的字段或方法參數(shù)。
CommonAnnotationBeanPostProcessor在Spring的容器初始化過程中起作用,它會(huì)掃描所有的Bean定義,并檢查是否存在使用了 @Resource注解的字段或方法參數(shù)。
當(dāng)檢測(cè)到這樣的注解時(shí),它會(huì)解析注解中指定的名稱(name),并嘗試查找匹配的依賴。
具體地說,CommonAnnotationBeanPostProcessor使用了Java的反射機(jī)制來解析注解,并通過 javax.annotation.Resource規(guī)范中定義的算法來查找匹配的依賴。根據(jù)規(guī)范,@Resource注解默認(rèn)按照字段或方法參數(shù)的名稱進(jìn)行依賴的匹配,也可以通過 name屬性指定特定的依賴名稱。
@Resource的使用方式:@Resource注解可以用于字段、方法和構(gòu)造函數(shù)上,用于指定要注入的依賴。下面是幾種常見的使用方式:
publicclassMyService{@Resourceprivate MyDependency dependency;// ...}
publicclassMyService{private MyDependency dependency;@ResourcepublicvoidsetDependency(MyDependency dependency){this.dependency = dependency; }// ...}
publicclassMyService{private MyDependency dependency;@ResourcepublicMyService(MyDependency dependency){this.dependency = dependency; }// ...}
在上述示例中,@Resource注解用于標(biāo)記要注入的依賴,并根據(jù)默認(rèn)的名稱匹配規(guī)則或顯式指定的名稱來查找依賴。
需要注意的是,@Resource注解是Java標(biāo)準(zhǔn)庫中的注解,因此它可以與Java SE和Java EE應(yīng)用程序一起使用,不僅限于Spring框架。
總結(jié)起來,@Resource注解是Java標(biāo)準(zhǔn)庫提供的一種依賴注入方式,在Spring中借助 CommonAnnotationBeanPostProcessor來實(shí)現(xiàn)。它可以用于標(biāo)記要注入的依賴,并根據(jù)名稱匹配規(guī)則或顯式指定的名稱來查找依賴。
當(dāng)涉及到 @Autowired注解的原理、使用方式以及與 @Resource注解的區(qū)別時(shí),我們需要了解它在Spring中的實(shí)現(xiàn)方式。下面我將詳細(xì)解釋 @Autowired的原理、使用方式以及與 @Resource注解的區(qū)別。
@Autowired注解是Spring Framework提供的一種依賴注入方式。它通過 AutowiredAnnotationBeanPostProcessor類來實(shí)現(xiàn)。AutowiredAnnotationBeanPostProcessor是一個(gè)Bean后置處理器,用于處理使用了 @Autowired注解的字段、方法或構(gòu)造函數(shù)參數(shù)。
在Spring的容器初始化過程中,AutowiredAnnotationBeanPostProcessor會(huì)掃描所有的Bean定義,檢查是否存在使用了 @Autowired注解的字段、方法或構(gòu)造函數(shù)參數(shù)。當(dāng)檢測(cè)到這樣的注解時(shí),它會(huì)解析注解,并根據(jù)依賴的類型來尋找匹配的Bean,并將其注入到目標(biāo)對(duì)象中。
具體來說,AutowiredAnnotationBeanPostProcessor使用了Java的反射機(jī)制來解析 @Autowired注解,并利用Spring容器中的Bean定義信息來查找匹配的依賴。它支持按照類型、名稱和限定符等方式進(jìn)行依賴的解析和注入。
@Autowired注解可以用于字段、方法和構(gòu)造函數(shù)上,用于指定要注入的依賴。下面是幾種常見的使用方式:
public class MyService { @Autowired private MyDependency dependency; // ...}```
public class MyService { private MyDependency dependency; @Autowired public void setDependency(MyDependency dependency) { this.dependency = dependency; } // ...}```
public class MyService { private MyDependency dependency; @Autowired public MyService(MyDependency dependency) { this.dependency = dependency; } // ...}```
在上述示例中,@Autowired注解用于標(biāo)記要注入的依賴。Spring會(huì)根據(jù)依賴的類型(或名稱和限定符)自動(dòng)查找匹配的Bean,并將其注入到目標(biāo)對(duì)象中。
盡管 @Autowired和 @Resource都是用于依賴注入的注解,但它們?cè)谝恍┓矫嬗幸恍﹨^(qū)別。
需要注意的是,盡管 @Autowired和 @Resource有一些區(qū)別,但在大多數(shù)情況下,它們可以互換使用。
如果您只是簡(jiǎn)單地進(jìn)行依賴注入,并且不需要關(guān)注兼容性問題,那么兩者的選擇取決于個(gè)人偏好。
在Spring Boot中,對(duì)于 private final字段的自動(dòng)注入,Spring使用構(gòu)造函數(shù)注入(Constructor Injection)來實(shí)現(xiàn)。當(dāng)一個(gè)Bean有一個(gè)或多個(gè) private final字段需要注入時(shí),Spring會(huì)嘗試在容器中查找與這些字段類型匹配的Bean,并使用構(gòu)造函數(shù)注入來實(shí)例化Bean對(duì)象。
構(gòu)造函數(shù)注入的原理是,Spring會(huì)查找與構(gòu)造函數(shù)參數(shù)類型匹配的Bean,并將它們作為參數(shù)傳遞給構(gòu)造函數(shù),從而實(shí)現(xiàn)對(duì) private final字段的賦值。
在使用 private final字段進(jìn)行自動(dòng)注入時(shí),需要遵循以下幾個(gè)步驟:
@Componentpublic class MyService { private final MyDependency dependency; public MyService(MyDependency dependency) { this.dependency = dependency; } // ...}```
需要注意的是,由于 private final字段是不可變的,一旦注入后就無法修改。這種不可變性有助于確保字段的安全性和線程安全性。
了不起和大家聊的springBean三種注入方式大家都爛熟于心了,具體使用還是看個(gè)人喜好,并無優(yōu)劣之分。
本文鏈接:http://www.tebozhan.com/showinfo-26-14586-0.htmlprivate final、@Autowired、@Resource你更喜歡哪個(gè)?
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com