上篇文章解決了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 的接口,直接拿過來用吧....