首頁  >  問答  >  主體

java - Servlet 获取 spring管理的bean

项目里面想在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还会有空指针的问题吗?

谢谢.

PHP中文网PHP中文网2741 天前509

全部回覆(1)我來回復

  • 天蓬老师

    天蓬老师2017-04-18 09:26:46

    正如你所說:Servlet是單一實例的,容器中只有一個Servlet物件來處理所有的客戶端請求, 因此:

    1.Servlet裡面可以存放一些全局的或不變的數據,但是不應該存放和用戶相關的數據, 否則由於多個用戶會在不同的線程中同時操作這些數據,就會導致混亂。

    2.mvc裡面也有一個Servlet,但是這個servlet在每次請求的時候,會new一個Controller, 這樣在Servlet的一次請求處理中,資料是相互沒有乾擾的。另外,一般spring管理的bean,會存放在ThreadLocal這樣的物件中,在controller處理完畢後,會清理ThreadLocal。

    3.道理同上,如果單獨寫, 應該new一個service,並且最後需要在處理完畢後清理ThreadLocal,否則會把殘留資料留給下一次資料處理, 導致資料不可預期。

    回覆
    0
  • 取消回覆