You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

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):批量添加多个对象,每个对象自动生成key
  • addAllAttributes(Map<String, ?> attributes):批量写入自定义键值对,已有key会被新值覆盖
  • mergeAttributes(Map<String, ?> attributes):批量写入自定义键值对,已有key不会被新值覆盖

内容的提问来源于stack exchange,提问作者Muazam Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:09:05