2010-11-06 140 views
2

我有一個使用註釋的彈簧控制器。我給這個控制器一個帶兩個參數的構造函數。我想要初始化控制器的兩種方法:構造函數注入和設置注入。Spring註釋控制器是否需要默認構造函數

@Controller("viewQuestionController") 
@RequestMapping("/public/viewQuestions") 
public class ViewQuestionController 
{ 
    @Resource(name="questionService") 
    private QuestionService questionService; 

    /*public ViewQuestionController() 
{ 
    int i=0; 
    i++; 
} 
    */ 

public ViewQuestionController(@Qualifier("questionService") QuestionService questionService) 
{ 
    this.questionService = questionService; 
} 

@Resource(name="questionService") 
public void setQuestionService(QuestionService questionService) 
{ 
    this.questionService = questionService; 
} 
} 

當我取消註釋默認構造函數時,控制器被正確啓動。但是,如果我不這樣做,我會得到一個BeanInstantiationException,找不到默認的構造函數;嵌套異常是java.lang.NoSuchMethodException。 因此,是我的配置註釋的構造函數是錯誤的還是在春天完全註釋的控制器總是需要一個默認的構造函數?

回答

4

如果要通過註釋配置構造函數注入,則需要在構造函數中放置相應的註釋。我不知道如何將其與@Resource,但@Autowired@Inject支持來完成它:

@Autowired 
public ViewQuestionController(@Qualifier("questionService") QuestionService questionService) 

@Inject 
public ViewQuestionController(@Named("questionService") QuestionService questionService) 
+0

謝謝,使用@Autowired的第一個選項工作。我沒有嘗試@Inject,因爲這需要在應用程序中添加另一個jar。我想我會在稍後看@Resource的setter注入。 – 2010-11-07 15:01:04

0

我認爲控制器豆類需要一個默認的構造函數,因爲它們是由框架初始化但是沒有辦法告訴框架很熱以提供依賴性。

一想到爲什麼不自動裝配你的問題服務,Spring會照顧它。 下面的代碼應該是不錯的

@Controller("viewQuestionController") 
@RequestMapping("/public/viewQuestions") 
public class ViewQuestionController 
{ 
     @Autowired 
     private QuestionService questionService; 

     //Not providing any constructor would also be fine 
     public ViewQuestionController(){} 

questionService會妥善由Spring初始化

+1

我試圖避免簡單的自動裝配,我想在注入時提及依賴項的名稱。我聽說當項目規模變大時,不建議使用簡單的自動裝配。 – 2010-11-07 09:54:14

+0

我曾與簡單的自動佈線體面大項目,它工作正常。事實上,JavaEE標準也提倡使用@Resource註釋並採用約定配置的原則。在純XML方式中,自動裝配在理解項目方面很難管理,但在註釋和配置在課堂級別的情況下,自動裝配是更好的選擇。 – lalit 2010-11-07 13:00:03

相關問題