찾다

 >  Q&A  >  본문

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中文网2810일 전530

모든 응답(1)나는 대답할 것이다

  • 天蓬老师

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

    말씀하신 대로 서블릿은 단일 인스턴스이므로 컨테이너에는 모든 클라이언트 요청을 처리하는 서블릿 개체가 하나만 있습니다.

    1. 서블릿은 일부 전역 데이터 또는 변경되지 않은 데이터를 저장할 수 있지만 사용자 관련 데이터는 저장하면 안 됩니다. 그렇지 않으면 여러 사용자가 동시에 이러한 데이터를 다른 스레드에서 작동하게 되어 혼란을 초래할 수 있습니다.

    2. mvc에도 서블릿이 있는데 이 서블릿은 요청할 때마다 새로운 컨트롤러를 생성하므로 서블릿이 요청을 처리하는 동안 데이터가 서로 간섭하지 않습니다. 또한 일반적으로 Spring에서 관리하는 Bean은 ThreadLocal과 같은 개체에 저장되며 컨트롤러가 처리된 후 ThreadLocal이 정리됩니다.

    3. 위와 같은 이유입니다. 별도로 작성한다면 새로운 서비스를 생성하고 처리가 완료된 후 최종적으로 ThreadLocal을 정리해야 합니다. 그렇지 않으면 다음 데이터 처리를 위해 잔여 데이터가 남게 됩니다. 데이터를 예측할 수 없게 만듭니다.

    회신하다
    0
  • 취소회신하다