java 爬坑記-@WebServlet異步 不支持@Autowired


上篇文章解決了500那個錯誤, 程序能接受到request ,進行到調用service 服務時,提示線程空指針異常, 檢查發現

//@Autowired
//OpHistoryService ophistoryservice;  類似這個 沒注入成功,當然調用時 是個null ,空指針了...

有人介紹說

、 Spring不能通過注解向Servlet中注入實例的原理

        想了解此問題的原理,就要了解tomcat啟動后 servlet和spring的加載順訊。

      1、  tomcat啟動后先加載web.xml文件。web.xml主要配置了servlet 、filter、listenner三種javaee規范的類,加載順序跟在web.xml文檔

中的位置無關。  順序為  listenner>filter>servlet 。

2、而spring的初始化類為org.springframework.web.context.ContextLoaderListener,就是一個listenner,它是先於servlet加載的。普通servlet和springmvc的入口servlet

的加載順序,就要看servle的設置了。
       3、在 servlet A類上加@service或@controllert等注解時,spring或springmvc會掃面相關包,自動實例化一個servlet 實例A;這個實例A的引用是spring容器管理的。
       4、當然 servlet也會在web.xml配置(要不然怎么攔截url),這是tomcat容器會根據servler配置啟動時或者第一次請求該url時實例化該servlet 實例B,
這個實例B的引用是tomcat容器管理的。
      5、明白了吧,攔截url的servlet和spring依賴注入的servlet不是同一個實例!!所以就產生了不能依賴注入或者注解不起作用的現象。
--------------------- 
作者:享受編程_ 
來源:CSDN 
原文:https://blog.csdn.net/u013476542/article/details/57084825 
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

文章二

如果servlet中需要用到spring中的applicationContext,我們是沒法直接通過@Autowired方式獲取的,需要用如下方式:
WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
 
running = context.getBean("running");
為什么呢?
在tomcat中,一個url請求進來到處理,經過這些步驟:tomcat 啟動,tomcat comtxt加載(在這兒是spring comtext加載,因為spring的comtext實現了tomcat中容器接口),filters,servletcontext啟動。。。在這兒servlet和applicationContext是兩個平級的概念。所以servlet只能夠通過tomcat中的api來獲取applicationContext對象。

還好spring留着程序員取bean 的接口,直接拿過來用吧....

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM