代码之家  ›  专栏  ›  技术社区  ›  Athens Holloway

Java Spring 3 MVC注释与COC。Java社区中的首选方法是什么?

  •  2
  • Athens Holloway  · 技术社区  · 15 年前

    我正在使用Spring的MVC框架来开发一个我托管在谷歌应用引擎上的应用程序。到目前为止,我的控制器是通过@controller注释注册的;但是,在进入Spring之前,我评估了ASP.NET MVC 2,它不需要配置,并且是基于约定的。常规配置(COC)是Java社区中用Spring实现MVC的当前和首选方法吗?此外,这可能是由于我目前所知有限,但我注意到,如果我通过 ControllerClassNameHandlerMapping . 例如,如果我使用 DefaultAnnotationHandlerMapping .

    <bean id="c" class="com.domain.TestController">
      <constructor-arg ref="service" />
    </bean>
    <bean id="service" class="com.domain.Service" />
    

    我的 com.domain.TestController 如果我用的话控制器工作正常 控制器类名句柄映射 /但它会导致我使用时出错 默认AnnotationHandlerMapping /注释。

    澄清 ,如果添加 @Autwired 对构造函数的注释,但是如果我这样做,我必须删除 @RequestMapping Annotation或I将收到一个错误,说明控制器多次映射到URL。一些在线研究表明 控制器类名句柄映射 正在加载控制器并将其映射到URL,即使 <context:annotation-config /> <context:component-scan base-package ... /> 在我的配置文件中。

    老实说,我可以克服这些问题。我只想知道哪种方法、注释或COC是更好的投资。

    1 回复  |  直到 12 年前
        1
  •  1
  •   RustyTheBoyRobot MatCas    14 年前

    棘手的问题;这有点主观,实际上取决于你的个人偏好或你的开发团队的共识。我个人喜欢注释,因为我觉得它更灵活。如果你必须遵循惯例才能让你的框架“自动地”做事情,你就会被框架开发者决定的惯例所束缚(当然,它通常不是 坏的 惯例,但你 坚持下去)。在我使用Spring的时候(大约2年左右),我们的团队似乎总是从使用CoC开始,但后来才意识到,典型的惯例并不能真正满足我们的需求。

    我还觉得注释可以提高代码的可读性。当查看一个带注释的类时,我可以理解它做什么以及它是如何做的,而不需要引用应用程序上下文。

    至于第二个问题(将bean注入控制器),这里有一些代码来说明我通常如何连接控制器。

    WebServel.xml

    <context:component-scan base-package="com.test.web.controllers" />
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/views/" p:suffix=".jsp" />
    

    测试控制器.java

    package com.test.web.controllers
    
    import com.test.dao.TestDAO;
    
    @Controller
    public class TestController {
        @Autowired
        @Qualifier("myTestDAO")
        private TestDAO testDAO;
    
        @RequestMapping(value = "/welcome.htm*", method = RequestMethod.GET)
        public ModelMap showWelcomePage() {
            ModelMap model = new ModelMap();
            model.addAttribute("products", testDAO.getOfferedProducts());
            return model;
        }
    }
    

    然后,testdao将具有以下类声明:

    @Repository("myTestDAO")
    public class TestDAO {
    

    我通常不使用构造函数连接,因为这通常比较简单,但是如果您需要构造函数连接,我可以发布一个这样的例子。