Spring Boot中model.addAttribute()方法的底层工作原理是什么?
Spring MVC
model.addAttribute() 工作原理解析 你在Spring MVC/Spring Boot控制器中使用的Model本质是后端处理逻辑和视图层之间的临时数据传递容器,addAttribute()就是该容器暴露的属性写入方法,具体运行逻辑如下:
1. 方法入参校验规则
调用addAttribute()时,Spring会先对入参做合法性校验和预处理:
- 如果你传入的属性值
attributeValue为null,Spring不会存入空值,而是直接将对应属性名的键值对从Model中移除 - 如果你调用的是省略属性名的重载方法
addAttribute(Object attributeValue),Spring会自动生成属性名作为存入的key:- 普通POJO对象取类名首字母小写,比如
Order类的实例自动生成key为order - 集合/数组类型取元素类名首字母小写+对应类型后缀,比如
List<Goods>自动生成key为goodsList
- 普通POJO对象取类名首字母小写,比如
2. 底层存储逻辑
Model的默认实现类是ExtendedModelMap,其底层本质就是一个LinkedHashMap<String, Object>结构,addAttribute()的核心操作就是对这个Map执行键值对写入:
核心实现伪代码参考:
public Model addAttribute(String attributeName, @Nullable Object attributeValue) { Assert.notNull(attributeName, "Model attribute name must not be null"); if (attributeValue != null) { this.attributes.put(attributeName, attributeValue); } else { this.attributes.remove(attributeName); } return this; }
该方法支持链式调用,你可以连续调用多次addAttribute()连续写入多个属性。
3. 数据传递到视图的全流程
Model中存储的数据是请求级别的,生命周期和当前HTTP请求完全绑定:
- 控制器方法执行完成后,
DispatcherServlet会遍历Model中的所有键值对,全部同步写入HttpServletRequest的属性域中,即执行request.setAttribute(key, value) - 后续视图解析器渲染页面时(JSP、Thymeleaf、Freemarker等),会直接从Request域中读取对应属性值,填充到页面的绑定位置
- 当前请求返回响应后,Model实例和对应Request域的数据会被全部销毁,新的请求会生成全新的Model实例
4. 常见重载方法差异
addAttribute(Object value):自动生成key,适合单实例、无命名冲突的简单属性传递addAttribute(String name, Object value):自定义key,适合同类型多实例、需要和前端变量名对齐的场景addAllAttributes(Collection<?> values):批量添加多个对象,每个对象自动生成keyaddAllAttributes(Map<String, ?> attributes):批量写入自定义键值对,已有key会被新值覆盖mergeAttributes(Map<String, ?> attributes):批量写入自定义键值对,已有key不会被新值覆盖
内容的提问来源于stack exchange,提问作者Muazam Hussain
相关产品推荐
相关产品推荐

