[英]Spring MVC: autowire ignored in servlets
由於某些原因,我可以在控制器中自動布線,但不能在我創建的servlet中自動布線。
這是我的servlet的頂部:
@Component
public class MyServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
@Autowired
private CobiService cobiService;
在我的web.xml中,這是相關的配置:
<servlet>
<servlet-name>convservlet</servlet-name>
<servlet-class>com.gim.servlets.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>convservlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
這就是我告訴spring掃描組件的方式:
<context:component-scan base-package="com.gim" />
由於某種原因,我的自動裝配對象cobiService為null。 我忘記了什么嗎? 我應該改變什么?
Servlet不是由Spring管理的,而是由Servlet容器(如Tomcat)管理的。 因此,Spring無法以正常的Spring方式將依賴項注入Servlet。 但是,您可以執行以下操作:
public class MyServlet extends javax.servlet.http.HttpServlet {
private CobiService cobiService;
@Override
public void init() throws ServletException {
super.init();
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
cobiService = applicationContext.getBean(CobiService.class);
}
}
有兩個正在創建的servlet。 當應用程序初始化並讀取web.xml
文件中配置的<servlet>
標記時,servlet容器/ Java EE容器將創建一個。 另一個將在Spring IOC容器在初始化時執行其組件掃描時創建。
在這種情況下,第一個實例不能參與依賴注入,因為它不是在Spring IOC容器中創建的。 為了參與依賴注入,必須由Spring IOC容器管理bean。 當servlet容器/ Java EE容器實例化servlet時,它不了解Spring的IOC容器。
不幸的是,當收到滿足servlet的web.xml
文件中指定的url-pattern
的請求時,該請求將重定向到servlet容器/ Java EE容器創建的第一個實例,該實例不是bean,也不是候選對象自動接線。
如果要從web.xml
刪除該servlet並向該servlet添加一個@RequestMapping
批注,則第二個實例(這是一個能夠利用自動裝配的實際bean)將用於在@RequestMapping
填充指定url模式的請求。但是到那時,您幾乎有了一個控制器。
因此,總而言之,我的建議是遵守Spring約定並使用控制器類。 控制器類將匹配並超過Servlet提供的功能。
您可以覆蓋servlet
init
方法,然后執行
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this);
沒必要做
implements javax.servlet.Servlet
,因為您正在擴展HttpServlet
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.