天天看點

說一說注解@Autowired @Resource @Reference使用場景

作者:網際網路架構小馬哥
前言

  在實際的開發過程當中,我們經常遇到各種依賴注入的場景,各種注解有時候的确讓人犯迷糊,那麼今天就來簡單的說一下在開發過程中最常用的三個注解,希望對大家有所幫助。@Autowired、@Resource和@Reference這三兄弟,在不同的架構和場景中使用。它們都用于解決對象之間的依賴關系,但在具體的應用場景下有着不同的使用方式和語義。

“大哥” @Autowired

  @Autowired注解是Spring架構提供的,用于自動裝配Bean的依賴關系,可以用于字段、構造函數和方法上。它通過類型比對實作依賴注入,并且支援按照名稱進行精确比對。@Autowired注解的使用場景如下:

字段注入

java複制代碼@Autowired
private Dependency dependency;
           

  在字段上标注@Autowired注解,Spring會嘗試根據類型來查找對應的Bean,并将其注入到該字段中。如果存在多個符合條件的Bean,可以使用@Qualifier注解指定具體的Bean名稱。

構造函數注入

java複制代碼@Autowired
public SomeClass(SomeDependency dependency) {
    this.dependency = dependency;
}
           

  通過在構造函數上标注@Autowired注解,Spring會自動建立依賴的執行個體并傳遞給構造函數,完成依賴注入。

方法注入

typescript複制代碼@Autowired
public void setDependency(SomeDependency dependency) {
    this.dependency = dependency;
}
           

  通過在方法上标注@Autowired注解,Spring會調用這個方法,并将依賴注入到方法參數中。

  @Autowired注解的優點是簡化了依賴注入的過程,提高了代碼的可讀性和靈活性。但它也存在一些限制,如無法解決多個實作類的比對問題,以及對于非Spring管理的對象無法使用。

使用場景和特點

  自動裝配Bean:當我們需要将一個Bean注入到另一個Bean中時,可以使用@Autowired注解。Spring會自動查找比對類型的Bean,并将其注入到目标Bean中。這樣可以簡化依賴管理,避免手動設定依賴關系。

  解決循環依賴:當存在循環依賴關系時,使用@Autowired注解可以解決依賴注入的問題。Spring會在運作時動态建立代理對象,以解決循環依賴的情況。這樣可以確定依賴關系的正确性和一緻性。

  高度靈活:@Autowired注解提供了多種注入方式,包括按類型、按名稱、按限定符等。這使得我們可以根據具體的需求來選擇合适的注入方式,提高了代碼的靈活性和可維護性。

“二哥” @Resource

  @Resource注解是Java EE規範中定義的注解,用于指定Bean的依賴關系。與@Autowired注解相比,@Resource注解更加靈活,可以通過名稱進行注入,并且支援按照類型進行比對。@Resource注解的使用場景如下:

字段注入

java複制代碼@Resource
private Dependency dependency;
           

  在字段上标注@Resource注解,預設按照字段名稱來查找對應的Bean,并将其注入到該字段中。如果存在多個符合條件的Bean,可以使用name屬性指定具體的Bean名稱。

方法注入

typescript複制代碼@Resource
public void setDependency(SomeDependency dependency) {
    this.dependency = dependency;
}
           

  通過在方法上标注@Resource注解,指定要注入的Bean。

  @Resource注解的優點是支援按名稱和類型進行注入,提供了更加靈活的依賴注入方式。

使用場景和特點

  注入依賴項:@Resource注解可以用于将一個Bean注入到另一個Bean中。它可以按名稱或類型進行比對,并将依賴項注入到目标Bean中。與@Autowired相比,@Resource注解更加靈活,可以根據名稱進行注入。

  引用其他元件:除了注入依賴項,@Resource注解還可以用于引用其他元件,如資料源、JMS隊列等。它可以通過名稱或類型引用指定的元件,友善在應用程式中使用其他資源。

  相容性廣泛:@Resource注解是Java EE标準的一部分,是以在Java EE環境中廣泛支援。同時,Spring架構也對@Resource注解進行了支援,可以在Spring應用程式中使用。

“老三” @Reference

  @Reference注解是Dubbo架構中用于引用遠端服務的注解,用于解決分布式系統中的服務調用問題。@Reference注解的使用場景如下:

java複制代碼@Reference
private SomeService someService;
           

  在Dubbo架構中,@Reference注解可以用于字段、構造函數和方法上,用于引用遠端服務。通過@Reference注解,Dubbo架構會自動建立一個代理對象,用于與遠端服務進行通信。

  @Reference注解的優點是提供了友善的遠端服務調用方式,支援負載均衡、容錯等特性。

使用場景和特點

  引用遠端服務:當需要調用遠端服務時,可以使用@Reference注解來引用Dubbo提供的遠端服務。通過指定服務接口,Dubbo會自動代理并注入實作該接口的遠端服務對象。這樣可以友善地實作分布式服務調用。

  服務發現與負載均衡:@Reference注解支援服務發現和負載均衡功能。Dubbo架構會根據配置的注冊中心和負載均衡政策,自動選擇可用的服務提供方,并将遠端服務注入到消費方中。

  高度可配置:@Reference注解提供了豐富的配置選項,包括逾時設定、重試政策、叢集容錯等。這使得我們可以根據實際需求對遠端服務進行精細化的配置和調整。

總結

  綜上所述,@Autowired、@Resource和@Reference都是用于解決對象之間的依賴關系的注解。@Autowired和@Resource主要用于本地Bean的依賴注入,而@Reference主要用于分布式系統中的服務調用。根據具體的使用場景和需求,選擇合适的注解來實作依賴注入。

作者:mikezhu

連結:https://juejin.cn/post/7259762775365468197

繼續閱讀