Autowired註解在抽象類中失效的原因及解決

2022-10-03 17:54:11 字數 1845 閱讀 9452

最近在工作中遇到這個問題,在抽象類中使用autowired這個註解,注入mybatis的dao時,總是出現空指標異常,通過日誌的列印,發現是這個dao注入失敗為空。然後通過new出spring上下文物件,再去呼叫getbean()方法,獲取到這個注入的dao,這樣是可行的,但是總是覺得這不是最佳實踐,一定有比這個更加優雅的方式能解決這個問題。

1.定義乙個抽象類

聲xxukgwypi明為spring元件,在其中自動裝配另乙個bean:

@component

public abstract class baseservice

2.然後在他的子類中使用這個自動裝配的物件

@component

public class myservice extends baseservice

}在我們例項化子類物件的程式設計客棧時候,抽象父類不能例項化,因為spring注入的是例項物件,而不是類,所以spring不會將dao自動裝配注入到乙個例項中。但是我們通過在在抽象類中獲取的上下文物件中卻可以拿到dao,因為這個上下文物件

是我們自己手動new出來的,不是spring通過反射注入到物件中去的。因此這種方案是可行的。

1.同樣是定義乙個抽象類

public class baseservice

2.在子類中使用註解

@component

public class myservice extends baseservice

public void print()

}這樣寫是不是要比我們直接去new applicationcontext更加優雅呢?

在本快速教程中,我們將說明如何在抽象類中使用 @autowired 自動裝配註解。

我們將 @autowired 應用於 abstract 抽象類,並關注此時要考慮的重點。

我們可以在設定方法上使用_@autowired_:

public abstract class ballservice

}當我們使用_@autowired_上setter方法,我們應該用final 關鍵字,這樣子類便不能覆蓋setter方法。否則,註解將無法正常執行。

我們不能在抽象類的建構函式上使用_@autowired_。

spring 不會在抽象類的建構函式上解析 @autowired 註解。子類應為 super 建構函式提供必要的引數。

相反,我們應該在子類的建構函式上使用_@autowired_:

public abstract class ballservice

}@component

public class basketballservicwww.cppcns.come extends ballservice

}讓我們總結一些要記住的規則。

首先,抽象類不會進行元件掃瞄,因為沒有具體的子類就無法例項化。

其次,在抽象類中可以進行setter注入,但是如果不對setter方法使用_final_關鍵字,因而存在一定誤用的風險。如果子類覆蓋 settexxukgwypir 方法,則應用程式可能不能正常執行。

第三,由於 spring 在抽象類中不支援建構函式注入,因此通常應該讓具體的子類提供構造函式引數。這意味著我們需要在具體子類中依賴建構函式注入。

最後,將建構函式注入用於必需的依賴項,並將setter注入用於可選的依賴項是乙個很好的經驗法則。但是,正如我們可以從抽象類的一些細微差別中看到的那樣,通常在這裡建構函式注入更為有利。

因此,實際上我們可以說具體的子類控制著它的抽象父類如何獲得其依賴項。 spring 在裝配子類時, 會對其依賴進行注入。

在本文中,我們練習了在抽象類中使用_@autowired_,並解釋了一些關鍵點。

本文標題: @autowired註解在抽象類中失效的原因及解決

本文位址:

在python中實現抽象類

抽象類就是從一堆類中抽取相似的功能建立乙個類作為父類,子類繼承父類,子類產生的物件在呼叫的時候,用法一樣,方便使用。抽象類的定義的函式沒有實現功能,只是規定了函式名,而且抽象類沒法例項化。class animals def run self pass class people animals def...

抽象類 抽象方法

抽象類 1.類名前有abstruct修飾。有構造方法。在建立抽象類的子類的時候,還是會先建立抽象父類的物件的。2.抽象類不能例項化是指不能手動的new。抽象方法 1.抽象方法 沒有方法體且需要用abstruct關鍵字修飾 作用 需要改變的地方都應該是抽象。抽象方法只能存在於抽象類或介面中。2.有抽象...

抽象類,抽象方法

1 抽象類中可以有實現的方法。抽象方法必須在抽象類中。using system using system.collections.generic using system.linq using system.text namespace test 抽象類可以包含抽象屬性 public int age...