最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

@Autowired注解在抽象類中失效

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

我們來還原一下這個問題:

1.定義一個抽象類

聲明為spring組件,在其中自動裝配另一個bean:

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

2.然后在他的子類中使用這個自動裝配的對象

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

在我們實例化子類對象的時候,抽象父類不能實例化,因為spring注入的是實例對象,而不是類,所以spring不會將dao自動裝配注入到一個實例中。但是我們通過在在抽象類中獲取的上下文對象中卻可以拿到dao,因為這個上下文對象

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

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

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

 public class BaseService {
     Dao dao;
 }
 

2.在子類中使用注解

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

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

在抽象類中使用@Autowired

1.簡介

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

我們將 @Autowired 應用于 abstract 抽象類,并關注此時要考慮的重點。

2.Setter 方式注入

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

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

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

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

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

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

相反,我們應該在子類的構造函數(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.備忘單

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

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

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

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

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

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

5.結論

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • SpringBoot監(jiān)聽應用程序啟動的生命周期事件的四種方法

    SpringBoot監(jiān)聽應用程序啟動的生命周期事件的四種方法

    在 Spring Boot 中,監(jiān)聽應用程序啟動的生命周期事件有多種方法,本文給大家就介紹了四種監(jiān)聽應用程序啟動的生命周期事件的方法,并通過代碼示例講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下
    2024-07-07
  • SpringBoot之LogBack配置詳解

    SpringBoot之LogBack配置詳解

    這篇文章主要介紹了SpringBoot之LogBack配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02
  • SpringBoot實現(xiàn)自定義啟動器的示例詳解

    SpringBoot實現(xiàn)自定義啟動器的示例詳解

    雖然Spring官方給我們提供了很多的啟動器供我們使用,但有時候我們也會遇到某些特殊場景,這些啟動器滿足不了。這個時候就需要自定義一個啟動器供我們使用,本文為大家介紹了SpringBoot實現(xiàn)自定義啟動器的方法,希望對大家有所幫助
    2023-01-01
  • Spring Boot整合QueryDSL的實現(xiàn)示例

    Spring Boot整合QueryDSL的實現(xiàn)示例

    這篇文章主要介紹了Spring Boot整合QueryDSL的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • JDBC數(shù)據(jù)庫連接過程及驅動加載與設計模式詳解

    JDBC數(shù)據(jù)庫連接過程及驅動加載與設計模式詳解

    這篇文章主要介紹了JDBC數(shù)據(jù)庫連接過程及驅動加載與設計模式詳解,需要的朋友可以參考下
    2016-10-10
  • 關于spring 掃描不到jar中class文件的原因分析及解決

    關于spring 掃描不到jar中class文件的原因分析及解決

    這篇文章主要介紹了關于spring 掃描不到jar中class文件的原因分析及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • RabbitMQ 避免消息重復消費的方法

    RabbitMQ 避免消息重復消費的方法

    消費者端實現(xiàn)冪等性,意味著消息永遠不會消費多次,即使收到了多條一樣的消息,這篇文章給大家分享RabbitMQ 避免消息重復消費的方法,感興趣的朋友一起看看吧
    2024-03-03
  • 分布式系統(tǒng)下調用鏈追蹤技術面試題

    分布式系統(tǒng)下調用鏈追蹤技術面試題

    這篇文章主要為大家介紹了分布式系統(tǒng)下調用鏈追蹤技術面試問題合集,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-03-03
  • springboot 整合 seata的配置過程

    springboot 整合 seata的配置過程

    本文給大家介紹springboot 整合 seata的配置過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • Java 實現(xiàn)FTP服務實例詳解

    Java 實現(xiàn)FTP服務實例詳解

    這篇文章主要介紹了Java 實現(xiàn)FTP服務實例詳解的相關資料,需要的朋友可以參考下
    2017-04-04

最新評論

屏南县| 当雄县| 抚顺县| 赤水市| 永嘉县| 嘉荫县| 灵石县| 屏东市| 扎兰屯市| 郴州市| 定远县| 锡林郭勒盟| 垣曲县| 秦皇岛市| 红原县| 丰县| 湾仔区| 高陵县| 揭阳市| 厦门市| 抚顺市| 宁国市| 丹江口市| 射阳县| 手游| 鹿邑县| 海门市| 安塞县| 辽源市| 肇州县| 伊春市| 海林市| 时尚| 凌海市| 浑源县| 安图县| 宁乡县| 二手房| 阿克陶县| 开封县| 上思县|