Maison  >  Questions et réponses  >  le corps du texte

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 Il y a quelques jours506

répondre à tous(1)je répondrai

  • 天蓬老师

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

    Comme vous l'avez dit : le Servlet est une instance unique, il n'y a qu'un seul objet Servlet dans le conteneur pour gérer toutes les requêtes des clients, donc :

    1. Le servlet peut stocker certaines données globales ou inchangées, mais les données relatives à l'utilisateur ne doivent pas être stockées, sinon plusieurs utilisateurs exploiteront ces données dans différents threads en même temps, ce qui entraînerait une confusion.

    2. Il existe également un servlet dans mvc, mais ce servlet créera un nouveau contrôleur à chaque fois qu'il fera une requête, de sorte que dans le traitement des requêtes du servlet, les données n'interfèrent pas les unes avec les autres. De plus, généralement les beans gérés par spring seront stockés dans des objets tels que ThreadLocal. Une fois le contrôleur traité, le ThreadLocal sera nettoyé.

    3. La même raison que ci-dessus. Si vous l'écrivez séparément, vous devez créer un nouveau service et enfin nettoyer le ThreadLocal une fois le traitement terminé, sinon les données résiduelles seront laissées pour le prochain traitement des données. ce qui entraîne des données imprévisibles.

    répondre
    0
  • Annulerrépondre