Java Spring 3.0 MVC Аннотация против COC. Какой метод предпочтителен в сообществе Java? - PullRequest
2 голосов
/ 16 марта 2010

Я использую Spring MVC Framework для приложения, размещенного на Google App Engine. Пока что мои контроллеры зарегистрированы через аннотацию @Controller; Однако, прежде чем перейти в Spring, я оценил ASP.net MVC 2, который не требует настройки и основан на соглашении. Является ли соглашение по конфигурации (COC) текущим и предпочтительным методом в сообществе Java для реализации MVC с помощью Spring? Кроме того, это может быть результатом моих ограниченных знаний до сих пор, но я заметил, что я могу создать для моих контроллеров только требуемую инъекцию конструктора, если я использую метод COC через ControllerClassNameHandlerMapping. Например, следующая конфигурация bean-компонента контроллера завершится неудачно, если я использую DefaultAnnotationHandlerMapping.

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

Мой com.domain.TestController контроллер работает нормально, если я использую ControllerClassNameHandlerMapping / COC, но это приводит к ошибке при использовании DefaultAnnotationHandlerMapping / Annotations.

Чтобы уточнить , я могу заставить работать инъекцию конструктора, если добавлю аннотацию @Autwired в конструктор, но если я это сделаю, мне придется удалить аннотацию @RequestMapping, или я получу ошибка, указывающая, что контроллер отображается на URL более одного раза. Некоторые онлайн-исследования показывают, что ControllerClassNameHandlerMapping загружает и отображает мой контроллер на URL, хотя у меня есть <context:annotation-config /> и <context:component-scan base-package ... /> в моем конфигурационном файле.

Честно говоря, я могу преодолеть эти проблемы. Я действительно просто хочу знать, какой метод, аннотация или COC, являются лучшими инвестициями.

1 Ответ

1 голос
/ 30 декабря 2010

Хитрый вопрос; это немного субъективно и действительно зависит только от ваших личных предпочтений или консенсуса вашей команды разработчиков. Мне лично нравятся аннотации, потому что я чувствую, что они более гибкие. Если вам нужно следовать соглашениям, чтобы заставить ваш фреймворк «автоматически» делать что-то, вы застряли на том соглашении, которое решили разработчики фреймворка (да, обычно это не плохое соглашение, но вы застрял с ним). Во время моего использования Spring (2 года или около того) всегда казалось, что наша команда начала использовать COC, но потом поняла, что наши потребности не совсем соответствуют типичному соглашению.

Я также чувствую, что аннотации улучшают читабельность вашего кода. Глядя на аннотированный класс, я могу понять, что он делает и как он делает, не обращаясь к контексту приложения.

Что касается вашего второго вопроса (внедрение bean-компонентов в контроллер), вот код, показывающий, как я обычно подключаю контроллер.

Веб-servlet.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" />

TestController.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 {

Я обычно не использую проводку конструктора, потому что это обычно проще, но если вам нужна проводка конструктора, я могу опубликовать пример этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...