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

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

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

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

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

3 ответа

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


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

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


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

Кажется, вы говорите: "Я хочу, чтобы некоторые данные добавлялись к моей модели для всех контроллеров".

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

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

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

licensed under cc by-sa 3.0 with attribution.