通过AOP+ObjectFactory+ThreadLocal实现
实现步骤:
初始化
- 在WebApplicationContextUtils注册依赖解析工厂,至于为何会调用此方法,需对spring 的bean初始化流程有一定的了解,可打断点追查
RequestObjectFactory实现
获取
- 通过调试,我们可以发现,注入的request是被代理过的
- 我们找到对应的代理类AutowireUtils类,其对应的invoke实现,我们可以看到request就是从对应的工厂(RequestObjectFactory)拿的request
-
而工厂实现中会获取ServletRequestAttributes进而获取request的,进一步追踪可看到,ServletRequestAttributesy又是从RequestContextHolder中获取的,而RequestContextHolder又是将其存放在ThreadLocal中的。
-
而其设置是在FrameworkServlet的initContextHolders方法中设置的,而FrameworkServlet则是Spring Mvc接收请求的Servlet
涉及到的类和方法
- WebApplicationContextUtils中的 registerWebApplicationScopes方法,
- WebApplicationContextUtils中的RequestObjectFactory静态内部类
- RequestContextHolder
- FrameworkServlet中的initContextHolders方法
版本信息
- SpringBoot 2.4.4
- Spring Mvc 5.3.5