簡體   English   中英

Spring MVC:servlet中忽略了自動裝配

[英]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);

SpringBeanAutowiringSupport

沒必要做

implements javax.servlet.Servlet ,因為您正在擴展HttpServlet

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM