Spring注释控制器是否必须需要默认构造函数

时间:2010-11-06 22:41:52

标签: spring annotations

我有一个使用注释的弹簧控制器。我给这个控制器一个带有两个参数的构造函数。我想要两种初始化控制器的方法:构造函数注入和setter注入。

@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。 那么,我对带注释的构造函数的配置是错误的还是Spring中一个完全带注释的控制器总是需要一个默认的构造函数?

2 个答案:

答案 0 :(得分:4)

如果要通过注释配置构造函数注入,则需要在构造函数上放置相应的注释。我不确定如何使用@Resource@Autowired@Inject支持它:

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

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

答案 1 :(得分:1)

我认为Controller bean需要一个默认的构造函数,因为它们是由框架初始化的,但没有办法告诉框架热门提供依赖。

第二个想到为什么你不用自动提问你的问题服务,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正确初始化