如果我关心IOC,如何在Spring MVC中最好地修改我的模型

时间:2020-03-06 15:05:02  来源:igfitidea点击:

我正在使用Spring MVC构建应用程序。我想对应用程序中的每个控制器的模型进行某些更改。特别是,我想在模型中插入某些额外的数据,这些数据将出现在应用程序的所有页面中。

我可以通过几种方法做到这一点:仅在每个Controller的末尾添加数据,使用添加我的额外数据的Model子类,使用包装我的模型的ModelAndView子类,使用在包装Model之前的VelocityView子类它...我确定还有其他选择。

但是我有一个"优雅"约束:我不想在每个控制器中都编写代码,我希望在一个唯一的地方定义此行为。理想情况下,它将由我的IOC bean配置文件控制。

有没有人建议如何优雅地做到这一点?

解决方案

我们可以看看如何使用Aspects。 Spring甚至具有我们可以使用的AOP扩展。

简而言之,一方面可以让我们定义一次代码,然后在编译类或者由类加载器加载类时将它们"编织"到类中。它是相对高级的东西,对于新程序员来说并不是最直观的东西,但是它旨在解决我们所指的问题。

方面是一种很好的方法,但是Spring MVC使其更容易-我们可以定义一个HandlerInterceptor,它将在每次处理请求之前或者之后调用。在HandlerInterceptor postHandle方法(在实现HandlerInterceptor接口的类中)中,可以将数据添加到ModelAndView。我们定义应在配置文件中拦截哪些处理程序。

我可能是错的,但是我怀疑我们可能没有正确描述要求。

我们似乎在说:"我想为所有控制器将某些数据添加到我的模型中"。

我怀疑意思是"我希望某些数据可用于所有视图"。

如果我的猜想是正确的,那么将数据添加到模型中将污染模型,并违反了单一责任原则。如果要将相同的数据添加到多个模型,则尤其如此。请注意,我们不只是将模型用作数据的便捷"载体",在这种情况下,数据实际上与模型没有任何关系。

诚然,我并不完全熟悉Spring MVC的处理方式,但是如果我们要尝试实现的目标的更详细的示例,则可以进行更深入的讨论。