Spring Boot中@GetMapping方法注入对象参数的实例创建原理疑问
Spring MVC请求方法自定义类型参数注入原理
该注入逻辑和类构造注入无关,属于Spring MVC处理HTTP请求阶段的请求方法参数解析机制,具体流程如下:
- 容器启动阶段:标注了
@Component的Cat类默认采用单例作用域,会在Spring容器初始化时就创建好全局唯一的实例,代码中Cat无参构造的打印逻辑会在项目启动时输出一次,不会在每次请求时触发。 - 请求处理阶段:当HTTP请求匹配到
@GetMapping对应的接口时,DispatcherServlet会先调度参数解析组件HandlerMethodArgumentResolver对目标方法的所有入参逐一处理:- 标注了
@PathVariable的name参数,由路径变量解析器从请求URL中提取对应值完成赋值 - Cat这类自定义Bean类型的入参,由对应解析器直接从Spring容器中取出已经初始化完成的Cat Bean,赋值给方法入参
- 标注了
- 若Cat类调整为请求作用域(添加
@Scope("request")注解),参数解析阶段会为当前请求单独创建一个新的Cat实例,此时无参构造的打印会在每次请求时触发。
注意:当前代码中Cat默认是单例Bean,多个请求同时修改name属性会出现线程安全问题,生产环境禁止使用该写法。如果需要每个请求持有独立的Cat实例,建议将Cat的作用域调整为request或者prototype。
相关参考可查阅Spring Framework官方文档中Web Servlet栈的Handler Methods相关章节,里面有完整的请求方法参数支持类型和解析规则说明。
内容的提问来源于stack exchange,提问作者Cepheon
相关产品推荐
相关产品推荐

