Как лучше изменить мою модель в Spring MVC, если я забочусь о IOC

StackOverflow https://stackoverflow.com/questions/167609

Вопрос

Я создаю приложение, используя Spring MVC. Я хочу внести определенные изменения в мою модель для каждого контроллера в приложении. В частности, я хочу вставить некоторые дополнительные данные в модель, которые будут присутствовать на всех страницах приложения.

Я мог бы сделать это несколькими способами: просто добавить данные в конце каждого контроллера, использовать подкласс Model, который добавляет мои дополнительные данные, использовать подкласс ModelAndView, который оборачивает мою модель, использовать подкласс VelocityView, который обертывает Модель перед ее использованием ... Я уверен, что есть другие варианты.

Но у меня есть "элегантность" ограничение: я не хочу писать код на каждом контроллере, я хочу, чтобы это поведение было определено в одно-единственное место. В идеале это будет контролироваться моим файлом конфигурации bean-компонента IOC.

У кого-нибудь есть рекомендации, как этого добиться элегантно?

Это было полезно?

Решение

Аспекты - это хороший подход, но Spring MVC делает его еще проще - вы можете определить HandlerInterceptor , который будет вызываться до или после каждой обработки запроса. В методе PostHandle HandlerInterceptor (в вашем классе, который реализует интерфейс HandlerInterceptor) вы можете добавить свои данные в ModelAndView. Вы определяете, какие обработчики должны быть перехвачены в вашем конфигурационном файле.

Другие советы

Вы можете взглянуть на использование Аспектов. В Spring даже есть расширение AOP , которое вы можете использовать .

Короче говоря, один аспект позволит вам определить код один раз, который затем получит " тканый " в ваши классы либо когда вы компилируете классы, либо когда они загружаются загрузчиком классов. Это относительно продвинутый материал, и он не является наиболее интуитивно понятным для начинающих программистов, но призван решить именно ту проблему, на которую вы ссылаетесь.

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

Похоже, вы говорите: «Я хочу, чтобы в мою модель были добавлены определенные данные для всех контроллеров».

Я подозреваю, что вы имеете в виду «Я хочу, чтобы определенные данные были доступны для всех просмотров».

Если мои подозрения верны, то добавление данных в вашу модель загрязняет вашу модель и нарушает принцип единой ответственности. Это особенно верно, если одни и те же данные должны быть добавлены к нескольким моделям. Будьте осторожны, вы не просто используете свою модель в качестве удобного «носителя» данных - когда данные на самом деле не имеют ничего общего с моделью.

Конечно, я не совсем знаком со способом работы Spring MVC, но более подробный пример того, чего вы пытаетесь достичь, может позволить провести более информированное обсуждение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top