欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2021年08月14日 11:32:52   作者:jy的blog  
這篇文章主要介紹了@Autowired注解在抽象類中失效的原因及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

@Autowired注解在抽象類中失效

最近在工作中遇到這個(gè)問題,在抽象類中使用Autowired這個(gè)注解,注入mybatis的dao時(shí),總是出現(xiàn)空指針異常,通過日志的打印,發(fā)現(xiàn)是這個(gè)dao注入失敗為空。然后通過new出spring上下文對(duì)象,再去調(diào)用getBean()方法,獲取到這個(gè)注入的dao,這樣是可行的,但是總是覺得這不是最佳實(shí)踐,一定有比這個(gè)更加優(yōu)雅的方式能解決這個(gè)問題。

我們來(lái)還原一下這個(gè)問題:

1.定義一個(gè)抽象類

聲明為spring組件,在其中自動(dòng)裝配另一個(gè)bean:

 @Component
 public abstract class BaseService {
      @Autowired
      Dao dao;
  }

2.然后在他的子類中使用這個(gè)自動(dòng)裝配的對(duì)象

 @Component
 public class myService extends BaseService{
     public void print(){
         //運(yùn)行時(shí)為null
         System.out.print(dao.toString());
     }
 }

在我們實(shí)例化子類對(duì)象的時(shí)候,抽象父類不能實(shí)例化,因?yàn)閟pring注入的是實(shí)例對(duì)象,而不是類,所以spring不會(huì)將dao自動(dòng)裝配注入到一個(gè)實(shí)例中。但是我們通過在在抽象類中獲取的上下文對(duì)象中卻可以拿到dao,因?yàn)檫@個(gè)上下文對(duì)象

是我們自己手動(dòng)new出來(lái)的,不是spring通過反射注入到對(duì)象中去的。因此這種方案是可行的。

下面介紹一種更優(yōu)雅的解決方案:

1.同樣是定義一個(gè)抽象類

 public class BaseService {
     Dao dao;
 }
 

2.在子類中使用注解

@Component
public class myService extends BaseService{
    //Autowired修飾方法時(shí),根據(jù)方法參數(shù)類型判斷實(shí)例化哪個(gè)類
    @Autowired 
    public void printDao(Dao dao){
        super.dao = dao;//父類屬性注入
    }
    public void print(){
        System.out.print(dao.toString());
    }
}

這樣寫是不是要比我們直接去new applicationContext更加優(yōu)雅呢?

在抽象類中使用@Autowired

1.簡(jiǎn)介

在本快速教程中,我們將說(shuō)明如何在抽象類中使用 @Autowired 自動(dòng)裝配注解。

我們將 @Autowired 應(yīng)用于 abstract 抽象類,并關(guān)注此時(shí)要考慮的重點(diǎn)。

2.Setter 方式注入

我們可以在設(shè)置方法上使用_@Autowired_:

public abstract class BallService {
    private LogRepository logRepository;
    @Autowired
    public final void setLogRepository(LogRepository logRepository) {
        this.logRepository = logRepository;
    }
}

當(dāng)我們使用_@Autowired_上setter方法,我們應(yīng)該用final 關(guān)鍵字,這樣子類便不能覆蓋setter方法。否則,注解將無(wú)法正常運(yùn)行。

3.構(gòu)造函數(shù)注入

我們不能在抽象類的構(gòu)造函數(shù)上使用_@Autowired_。

Spring 不會(huì)在抽象類的構(gòu)造函數(shù)上解析 @Autowired 注解。子類應(yīng)為 super 構(gòu)造函數(shù)提供必要的參數(shù)。

相反,我們應(yīng)該在子類的構(gòu)造函數(shù)上使用_@Autowired_:

public abstract class BallService {
    private RuleRepository ruleRepository;
    public BallService(RuleRepository ruleRepository) {
        this.ruleRepository = ruleRepository;
    }
}
@Component
public class BasketballService extends BallService {
    @Autowired
    public BasketballService(RuleRepository ruleRepository) {
        super(ruleRepository);
    }
}

4.備忘單

讓我們總結(jié)一些要記住的規(guī)則。

首先,抽象類不會(huì)進(jìn)行組件掃描,因?yàn)闆]有具體的子類就無(wú)法實(shí)例化。

其次,在抽象類中可以進(jìn)行setter注入,但是如果不對(duì)setter方法使用_final_關(guān)鍵字,因而存在一定誤用的風(fēng)險(xiǎn)。如果子類覆蓋 setter 方法,則應(yīng)用程序可能不能正常運(yùn)行。

第三,由于 Spring 在抽象類中不支持構(gòu)造函數(shù)注入,因此通常應(yīng)該讓具體的子類提供構(gòu)造函數(shù)參數(shù)。這意味著我們需要在具體子類中依賴構(gòu)造函數(shù)注入。

最后,將構(gòu)造函數(shù)注入用于必需的依賴項(xiàng),并將setter注入用于可選的依賴項(xiàng)是一個(gè)很好的經(jīng)驗(yàn)法則。但是,正如我們可以從抽象類的一些細(xì)微差別中看到的那樣,通常在這里構(gòu)造函數(shù)注入更為有利。

因此,實(shí)際上我們可以說(shuō)具體的子類控制著它的抽象父類如何獲得其依賴項(xiàng)。 Spring 在裝配子類時(shí), 會(huì)對(duì)其依賴進(jìn)行注入。

5.結(jié)論

在本文中,我們練習(xí)了在抽象類中使用_@Autowired_,并解釋了一些關(guān)鍵點(diǎn)。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot文件上傳的原理解析

    SpringBoot文件上傳的原理解析

    這篇文章主要介紹了SpringBoot文件上傳的原理解析,SpringBoot 文件上傳是一種方便快捷的方式,可以將文件上傳到服務(wù)器,通過使用SpringBoot的文件上傳功能,可以輕松地實(shí)現(xiàn)文件上傳功能,需要的朋友可以參考下
    2023-10-10
  • 深入講解基于JDK的動(dòng)態(tài)代理機(jī)制

    深入講解基于JDK的動(dòng)態(tài)代理機(jī)制

    眾所周知相比于靜態(tài)代理,動(dòng)態(tài)代理避免了開發(fā)人員編寫各個(gè)繁鎖的靜態(tài)代理類,下面這篇文章主要給大家介紹了關(guān)于基于JDK的動(dòng)態(tài)代理機(jī)制的相關(guān)資料,文中通過圖文以及示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • Java中@ConfigurationProperties實(shí)現(xiàn)自定義配置綁定問題分析

    Java中@ConfigurationProperties實(shí)現(xiàn)自定義配置綁定問題分析

    這篇文章主要介紹了@ConfigurationProperties實(shí)現(xiàn)自定義配置綁定問題,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 你肯定能看懂的Java IO相關(guān)知識(shí)總結(jié)

    你肯定能看懂的Java IO相關(guān)知識(shí)總結(jié)

    群里有大佬說(shuō)想讓我寫一篇NIO,一直也沒寫,但是和同事聊天也說(shuō)對(duì)Java的IO不是很清晰,因此今天就寫下Java的io,先打個(gè)基礎(chǔ),下次寫NIO,需要的朋友可以參考下
    2021-05-05
  • Java關(guān)于List集合去重方案詳細(xì)介紹

    Java關(guān)于List集合去重方案詳細(xì)介紹

    實(shí)際項(xiàng)目開發(fā)中,很多業(yè)務(wù)場(chǎng)景下都會(huì)遇見集合去重。在說(shuō)到List集合去重之前,首先我們回顧下普通類型的list如何去重
    2021-09-09
  • java?web項(xiàng)目Session獲取不到問題及解決

    java?web項(xiàng)目Session獲取不到問題及解決

    這篇文章主要介紹了java?web項(xiàng)目Session獲取不到問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java?Mybatis使用resultMap時(shí),屬性賦值順序錯(cuò)誤的巨坑

    Java?Mybatis使用resultMap時(shí),屬性賦值順序錯(cuò)誤的巨坑

    這篇文章主要介紹了Java?Mybatis使用resultMap時(shí),屬性賦值順序錯(cuò)誤的巨坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • jmeter基本使用小結(jié)

    jmeter基本使用小結(jié)

    jmeter是apache公司基于java開發(fā)的一款開源壓力測(cè)試工具,體積小,功能全,使用方便,是一個(gè)比較輕量級(jí)的測(cè)試工具,使用起來(lái)非常簡(jiǎn)單。本文就簡(jiǎn)單的介紹一下如何使用,感興趣的
    2021-11-11
  • 手動(dòng)模擬JDK動(dòng)態(tài)代理的方法

    手動(dòng)模擬JDK動(dòng)態(tài)代理的方法

    這篇文章主要介紹了手動(dòng)模擬JDK動(dòng)態(tài)代理的方法,幫助大家更好的了解和學(xué)習(xí)Java 代理的相關(guān)知識(shí),感興趣的朋友可以了解下
    2020-11-11
  • Java 深入淺出掌握Map集合之雙列集合

    Java 深入淺出掌握Map集合之雙列集合

    雙列集合是每個(gè)元素都有鍵與值兩部分組成的集合,記錄的是鍵值對(duì)對(duì)應(yīng)關(guān)系,即通過鍵可以找到值,鍵必須是唯一,值可以重復(fù),接下來(lái)跟著小編具體了解吧
    2021-11-11

最新評(píng)論