Spring mvc bean充当没有@Controller声明的控制器

时间:2014-06-02 17:31:34

标签: java spring spring-mvc

任何人都可以向我解释一下使用@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'部分。

1 个答案:

答案 0 :(得分:1)

对于RequestMappingHandlerMapping没有区别,只需查看RequestMappingHandlerMapping#isHandler(),两个注释都有效。

但是,对于HandlerMappings层次结构中的其他AbstractControllerUrlHandlerMapping@Controller注释会解决问题。

请注意,在Spring MVC中,Controller 任何类任何方法HandlerMapping映射到请求。执行它也需要HandlerAdapter