在Spring MVC中设置全局模型属性的最佳实践是什么?


问题内容

我有一个数据驱动(缓存)菜单,它是一个全局组件。我希望能够为每个请求注入菜单项,因为每个页面都将使用它。放置它的最佳位置是什么?我正在使用基于注释的Spring3。我能想到的最佳解决方案是使用OncePerRequestFilter并将其添加到该子类或对Controller进行子类化,但不确定如何使用@Controller批注来实现。


问题答案:

我可以想到两个简单的选择:

每个@Controller类都将数据公开为带有注释的方法@ModelAttribute,例如

@ModelAttribute
public MyData getMyData() {
  ...
}

但是,如果您有多个控制器,那并不是很好。而且,这具有myData为每个重定向将on 编码为URL 的烦人的副作用

我建议改为实施一个HandlerInterceptor,然后以这种方式将数据公开给每个请求。您不能使用任何喜欢注释的方法,但最好通过这种方式将其与业务逻辑分开。这与您的OncePerRequestFilter想法相似,但更具弹性。