ホームページ  >  に質問  >  本文

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日前505

全員に返信(1)返信します

  • 天蓬老师

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

    あなたが言ったように、サーブレットは単一のインスタンスであり、すべてのクライアントリクエストを処理するコンテナー内にはサーブレットオブジェクトが 1 つだけあります。したがって、次のようになります。

    1. サーブレットは一部のグローバル データまたは変更されていないデータを保存できますが、ユーザー関連のデータは保存しないでください。そうしないと、複数のユーザーがこれらのデータを異なるスレッドで同時に操作することになり、混乱が生じます。

    2. mvc にもサーブレットがありますが、このサーブレットはリクエストを行うたびに新しいコントローラーを作成するため、サーブレットのリクエスト処理においてデータが相互に干渉しません。また、一般的に Spring で管理する Bean は ThreadLocal などのオブジェクトに格納され、コントローラーの処理後に ThreadLocal がクリーンアップされます。

    3. 上記と同じ理由で、新しいサービスを作成し、処理が完了した後に最後に ThreadLocal をクリーンアップする必要があります。そうしないと、次のデータ処理のために残りのデータが残ります。その結果、予測不可能なデータが生成されます。

    返事
    0
  • キャンセル返事