Spring Boot @Component注解下的類 @Autowired 為null


Spring Boot @Component注解下的類 @Autowired 為null【原文

  @Component
        public class ComponentClass {

      @Autowired
      private JedisClient jedisClient;
      public static ComponentClass componentClass;
      @PostConstruct
      public void init(){
          componentClass = this;
          componentClass.jedisClient = this.jedisClient;
      }
  }
  // 后續使用 componentClass.jedisClient.**()

沒注入成功,或者說是此類在bean加載之前就被調用了。
聲明一個此類的靜態變量,用以保存bean。
使用@PostConstruct注解,將需要注入的類添加到靜態變量中。
接下來,使用這個靜態變量來調用注入類就行了。
@PostConstruct這個注解的具體作用就是:

注解在方法上,表示此方法是在Spring實例化該bean之后馬上執行此方法,之后才會去實例化其他bean。

這樣在Spring實例化ComponentClass之后,馬上執行此方法,初始化ComponentClass靜態對象和成員變量jedisClient。

spring中Constructor、@Autowired、@PostConstruct的順序 【原文

其實從依賴注入的字面意思就可以知道,要將對象p注入到對象a,那么首先就必須得生成對象p與對象a,才能執行注入。所以,如果一個類A中有個成員變量p被@Autowired注解,那么@Autowired注入是發生在A的構造方法執行完之后的。

如果想在生成對象時候完成某些初始化操作,而偏偏這些初始化操作又依賴於依賴注入,那么就無法在構造函數中實現。為此,可以使用@PostConstruct注解一個方法來完成初始化,@PostConstruct注解的方法將會在依賴注入完成后被自動調用。

Constructor >> @Autowired >> @PostConstruct

    public Class AAA {
        @Autowired
        private BBB b;

        public AAA() {
            System.out.println("此時b還未被注入: b = " + b);
        }

        @PostConstruct
        private void init() {
            System.out.println("@PostConstruct將在依賴注入完成后被自動調用: b = " + b);
        }
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM