@Autowired註解和靜態方法 、靜態變數的初始化順序
今天在寫專案的時候,遇到這麼一個問題:
@Autowired
CategoryMapper categoryMapper;
private List<Category> categoryList = categoryMapper.selectByExample(new CategoryExample());
這段程式碼報java.lang.NullPointerException: null異常。報錯資訊說:該類初始化時出錯,出錯原因是例項化bean時構造方法出錯,在構造方法裡丟擲了空指標異常。
這讓我開始思考@Autowired
例項變數與構造方法的初始化順序問題,查詢相關資料得知:
1、Java類會先執行構造方法,然後再給註解了@Autowired
的categoryMapper注入值,所以在執行構造方法的時候,就會報錯。
2、將categoryList改為靜態變數也不行,因為@Autowired
注入是在容器中例項化物件,不是靜態的。
總結:Java變數的初始化順序為:靜態變數或靜態語句塊–>例項變數或初始化語句塊–>構造方法–>@Autowired
解決辦法:
使用構造器注入的方法,明確了成員變數的載入順序。如下
private CategoryMapper categoryMapper; private List<Category> categoryList; @Autowired public CategoryServiceImpl(CategoryMapper categoryMapper) { this.categoryMapper = categoryMapper; this.categoryList = categoryMapper.selectByExample(new CategoryExample()); }
參考資料:
http://www.mamicode.com/info-detail-1780320.html
https://blog.csdn.net/ruangong1203/article/details/50992147
https://www.cnblogs.com/vinplezhang/p/5395846.html
https://www.cnblogs.com/chenfeng1122/p/6270217.html
相關推薦
Java構造方法、成員變數初始化以及靜態成員變數初始化三者的先後順序是什麼樣的?
【Java筆試真題】:構造方法、成員變數初始化以及靜態成員變數初始化三者的先後順序是什麼樣的? 【解答】: 當類第一次被載入的時候,靜態變數會首先初始化,接著編譯器會把例項變數初始化為預設值,然後執行構造方法。 Java程式的初始化一般遵循以下三個原則(以下三原則優先順序依次遞減): ①
@Autowired註解和靜態方法 、靜態變數的初始化順序
今天在寫專案的時候,遇到這麼一個問題:@Autowired CategoryMapper categoryMapper; private List<Category> categoryList = categoryMapper.selectByExample(
Java基礎篇——靜態程式碼塊、靜態方法、靜態變數、構造方法、構造程式碼段相關
基本定義 靜態程式碼段 在Java類的設計中,如果某段程式碼想讓其只執行一次,比如一個HashMap的生成,一個數據庫連線池的產生,就可以把相關程式碼寫入static{}包裹的程式碼段中。這個程式碼段就叫靜態程式碼段,在專案啟動時就主動執行,即由虛擬機器內部完成呼叫,且只執
java中非靜態內部類不能有靜態程式碼塊、靜態方法、靜態變數?
非靜態內部類相當於外部類中的非靜態成員變數,而如果外部類需要呼叫非靜態成員變數就需要先例項化才可以,如果非靜態內部類中有靜態方法塊,那麼又可以在載入類的時候提前載入,不需要考慮外部類的例項化,所以有矛盾,所以不可以。為什麼非靜態內部類中可以有靜態常量?(static fina
Java-為什麼非靜態內部類裡面不能定義靜態方法、靜態成員變數、靜態初始化塊?
首先要明確一點: static修飾方法、成員變數是屬於類自己的。並不屬於特定的某個物件。所以我們可以像這樣使用static修飾的方法、變數:ClassName.methodName、ClassName
Kotlin開發Android專案之靜態方法、靜態變數使用示例
Kotlin開發Android專案之靜態方法、靜態變數使用示例 1.Kotlin定義一個都是靜態方法的類 Kotlin定義一個都是靜態方法的類,比如專案中比較常見的工具類,只需要將類class換為object即可,下面是Java寫法和Kotlin寫法的對比: Java寫法:
JAVA的靜態變數、靜態方法、靜態類
靜態變數和靜態方法都屬於靜態物件,它與非靜態物件的差別需要做個說明。 (1)Java靜態物件和非靜態物件有什麼區別? 比對如下: 靜態物件
靜態變數、靜態語句塊、靜態方法、語句塊的執行順序
今天想檢視下靜態變數、靜態方法、靜態語句塊的執行順序,找了許多文章發現沒有描述完全的,所以自己來寫下吧。。。。。。 在程式碼執行呼叫和執行的時候分為兩種關係,一種是有繼承關係的,另一種是沒有繼承關係的
Java靜態方法,靜態變數,初始化順序
靜態方法的宣告和定義 定義一個靜態方法和定義一個例項方法,在形式上並沒有什麼區別,只是在宣告的頭部,需要加上一個關鍵字static。它的一般語法形式如下: [訪問許可權修飾符] static [返回值型別] 方法名([引數列表]){ 語句序列 } 例如下面是一個靜態的方法: pu
Java基礎知識之synchronized同步方法、程式碼塊、靜態方法、靜態程式碼塊的區別
Java中的同步塊用synchronized標記,是同步在某個物件上,所有同步在一個物件上的同步塊在同一時刻只能被一個執行緒進入並執行操作,其他等待進入該同步塊的執行緒將被阻塞,直到執行該同步塊中的執行緒退出。 有四種不同的同步塊: 例項方法同步;
Java面向物件-final類和final方法、final變數(常量)
為什麼得需要使用final修飾符 繼承關係最大的弊端是破壞封裝:子類能訪問父類的實現細節,而且可以通過方法覆蓋的形式修改實現細節。 final本身的含義是“最終的,不可改變的”,它可以修飾抽象類,非抽象方法和變數。 注意:構造方法不能使用final修飾,因
static程式碼塊、成員變數初始化、構造方法執行順序
下面程式碼: public class Son{ Father father = new Father(); static{ System.out.println("Son static"); } publi
Java 構造方法和成員變數初始化順序
一定要注意,成員變數按照其宣告的順序會被初始化,並且立刻被初始化為二進位制的0,這個動作發生在所有事件之前,也就是編譯器會立刻將分配給物件的空間初始化。最後就是呼叫類的構造方法了。執行順序: 執行父類靜態程式碼 執行子類靜態程式碼 初始化父類成員變數(我們常說的賦值語句)
構造方法、類的初始化塊以及類欄位的初始化順序
構造方法 首先,以下程式碼為何無法通過編譯?哪兒出錯了? public class Test { public static void main(String[] a
java變數初始化順序
在類的內部,變數定義的先後順序決定了初始化順序,即使變數定義分散在方法定義之外,它們依舊會在任何方法(包括構造器)被呼叫之前得到初始化 其中初始化的順序先是靜態物件,其後是非靜態物件 例如: class Cat{ private Dog dog1=new Dog(1)
c++ 類成員變數初始化順序
#include <iostream> using namespace std; class A { public: //使用初始化列表初始化時,與定義成員變數的順序有關。 //因為成員變數的初始化次序是根據變數在
Java類、例項的初始化順序
今晚是阿里巴巴 2013 校園招聘的杭州站筆試。下午匆忙看了兩張歷年試卷,去現場打了瓶醬油。 題目總體考察點偏基礎,倒數第二題(Java 附加題)比較有趣,考察了 Java 初始化機制的細節,在此摘錄出來。 題目 求如下 java 程式碼的輸出: 1 2 3 4 5 6 7 8 9 10 11
變數初始化順序
在一個類裡,初始化的順序是由變數在類內的定義順序決定的。即使變數定義大量遍佈於方法定義的中間,那些變數仍會在呼叫任何方法之前得到初始化——甚至在構建器呼叫之前。例如: //: OrderOfInitialization
C++類成員變數初始化順序問題
今天在看劍指offer這本書時,看待一個簡單的舉例,說應聘C++崗位的不知道成員變數初始化順序!我很驚訝,因為我也不知道,所以就看上網查了一下,看到了一個部落格()以及其中的內容,現在將我的學習過程分
java 建立物件的四種方式、java物件初始化順序
java建立物件的幾種方式: (1) 用new語句建立物件,這是最常見的建立物件的方法。 (2) 運用反射手段,呼叫java.lang.Class或者java.lang.reflect.Const