2010-11-06 94 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

相关问题