任何人都可以向我解释一下使用@Controller声明一个类与使用@Scope声明它并在applicationContext.xml中定义一个bean之间的区别
这是我的情况。
方法1 :使用@Scope声明类并在applicationContext.xml中添加bean定义
AbcController.java:
package my.app.controller;
@Scope("singleton")
@RequestMapping(value = "/abc")
public class AbcController {
@RequestMapping(value = "/simulate_abc", method = RequestMethod.GET)
public String getFactorsForSimulate(ModelMap model) {
model.addAttribute("Welcome to the simulations page");
return "simulate_abc";
}
}
的applicationContext.xml
<bean id="abcController" class="my.app.controller.AbcController"/>
方法2 :使用@Controller声明类,并在applicationContext.xml中没有bean定义
package my.app.controller;
@Controller
@RequestMapping(value="/abc")
public class AbcController {
@RequestMapping(value = "/simulate_abc", method = RequestMethod.GET)
public String getFactorsForSimulate(ModelMap model) {
model.addAttribute("Welcome to the simulations page");
return "simulate_abc";
}
}
在这里,两种方法都给了我预期的结果(带我去'simulate_abc.jsp'并附上模型的消息)。我想明白,为什么 Approach1 没有失败?虽然它有一个RequestMapping,但由于它没有被声明为控制器,为什么“视图”会得到解决? 我觉得 Approach1 是错误的,因为它不满足春天'MVC'中的'C'部分。
答案 0 :(得分:1)
对于RequestMappingHandlerMapping
没有区别,只需查看RequestMappingHandlerMapping#isHandler(),两个注释都有效。
但是,对于HandlerMappings
层次结构中的其他AbstractControllerUrlHandlerMapping
,@Controller
注释会解决问题。
请注意,在Spring MVC中,Controller 任何类,任何方法,HandlerMapping
映射到请求。执行它也需要HandlerAdapter
。