2017-02-09 44 views
0
@Autowired 
    @Qualifier("stringMatchedBasedAnswerSuggestion") 
    private SuggestionEvaluator stringMatchBasedEval; 

    private List<SuggestionEvaluator> listEvaluators; 


    public AnswerSuggestionServiceImpl() { 
     if (listEvaluators == null) { 
      listEvaluators = new ArrayList<SuggestionEvaluator>(); 
      // All the additional objects to be added. 
      listEvaluators.add(stringMatchBasedEval); 
      Collections.sort(listEvaluators, SuggestionEvaluator.compareByPriority()); 

     } 
    } 

在這種情況下,構造函數中的代碼將首先執行或者將創建bean。請問stringMatchBasedEval是否爲null?在Spring中,bean是首先創建的,還是通過構造器第一次創建實例

+0

構造函數會先被調用,然後bean被注入。我敢打賭你會得到NPE。 – SMA

+0

Craig Otis和SMA在您看來存在衝突 – user3646858

+0

Java對構造函數的調用隱含在對象實例中,直到newInstance()返回後才能對新實例執行任何操作,因此無法進行注入... – Adam

回答

3

構造將首先從而調用你的stringMatchBasedEval將在時間空。問題非常普遍,有一個非常常見的解決方案。一般來說,你的構造函數應該是空的,你的初始化邏輯應該被移動到單獨的方法中(通常稱爲init()),該方法用@PostConstruct註釋標記,Spring將在構造函數之後立即調用它並完成所有注入。因此您的stringMatchBasedEval將被初始化。

@Autowired 
@Qualifier("stringMatchedBasedAnswerSuggestion") 
private SuggestionEvaluator stringMatchBasedEval; 

private List<SuggestionEvaluator> listEvaluators; 


public AnswerSuggestionServiceImpl() { 
} 

@PostConstruct 
private void init() { 
    if (listEvaluators == null) { 
     listEvaluators = new ArrayList<SuggestionEvaluator>(); 
     // All the additional objects to be added. 
     listEvaluators.add(stringMatchBasedEval); 
     Collections.sort(listEvaluators, SuggestionEvaluator.compareByPriority()); 

    } 
} 
2

在注入方法中,爲了注入一個bean,必須有已經創建的注入對象。之後,你必須設置它的豆子。我認爲很明顯,首先創建對象,並在此之後,注入bean。

所以,首先執行構造函數,之後,注入bean。

+1

值得一提的是,使用@PostConstruct的方法可以用於在注入所有內容後執行任何邏輯... – Adam

1

要向對象中注入東西,spring首先應該創建對象。

您可以使用基於構造函數的注入爲你的情況:

@Autowired 
public AnswerSuggestionServiceImpl(@Qualifier("stringMatchedBasedAnswerSuggestion") SuggestionEvaluator stringMatchBasedEval) { 
    if (listEvaluators == null) { 
     listEvaluators = new ArrayList<SuggestionEvaluator>(); 
     // All the additional objects to be added. 
     listEvaluators.add(stringMatchBasedEval); 
     Collections.sort(listEvaluators, SuggestionEvaluator.compareByPriority()); 

    } 
} 
+1

對於多個依賴項,這不是可伸縮的......我推薦@PostConstruct方法... – Adam

相關問題