java - Servlet 获取 spring管理的bean

 荣哥918 发布于 2022-10-27 13:03

项目里面想在servlet用spring注入的service等bean的时候,报空指针异常,网上的解释:

其实我们使用spring的目的就是为了让spring为我们来提供一个已经被注入好的一个实例。而servlet是不同的,servlet是有生命周期的,而这个并不归属spring管理,而是由web容器管理的。那么当servlet刚刚创建的时候,spring可以为servlet注入,当你访问的时候,由于servlet是单实例多线程的,所以,servlet信息被重置,刚刚被注入的对象又为null了。

我有一些问题,

  1. servlet是单实例的,但是如果我注入的bean是成员变量,那么即使是多次请求,这个bean 也是在堆内存里面,为什么servlet信息会被重置呢?

  2. 如果是spring mvc,为什么在controller里面可以直接调用其他spring 容器管理的bean。

  3. 如果我在servlet里面调用service , service里面再调用spring注入的bean还会有空指针的问题吗?

谢谢.

1 个回答
  • 正如你所说:Servlet是单实例的,容器中只有一个Servlet对象来处理所有的客户端请求, 因此:

    1.Servlet里面可以存放一些全局的或不变的数据,但是不应该存放和用户相关的数据, 否则由于多个用户会在不同的线程中同时操作这些数据,就会导致混乱。

    2.mvc里面也有一个Servlet,但是这个servlet在每次请求的时候,会new一个Controller, 这样在Servlet的一次请求处理中,数据是相互没有干扰的。另外,一般spring管理的bean,会存放在ThreadLocal这样的对象中,在controller处理完毕后,会清理ThreadLocal。

    3.道理同上,如果单独写, 应该new一个service,并且最后需要在处理完毕后清理ThreadLocal,否则会把残留数据留给下一次数据处理, 导致数据不可预期。

    2022-10-27 23:20 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有