通過代理的方式讓Spring注入Servlet

wtopps發表於2017-05-27

使用Spring注入Servlet

正常情況下我們呼叫Servlet,需要在web.xml配置檔案中加入響應的配置,指明servlet的資訊,而當servlet數量非常多的時候,這樣的方式會很不方便,下面介紹一下使用通過Spring的自動注入,將servlet類交給spring託管的方案。

我們需要建立一個類似於DelegatingFilterProxy那樣的代理,通過代理根據配置來找到實際的Servlet,完成業務邏輯功能。

我們有一個servlet類:

@Component
public class MyServlet extends HttpServlet {                                                                                    

@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException{
    this.doPost(request, response); 
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException{
    //doSomething.......
}
}

建立代理類:

public class DelegatingServletProxy extends GenericServlet {
    private String targetBean;
    private Servlet proxy;

    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        //呼叫對應servlet的doGet、doPost
        proxy.service(req, res);
    }

    @Override
    public void init() throws ServletException {
        //獲取web.xml中servlet的名字
        this.targetBean = getServletName();
        WebApplicationContext wc= WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());  
        //獲取對應的servlet例項
        this.proxy = (Servlet) wc.getBean(targetBean);
        //初始化servlet
        proxy.init(getServletConfig());
    }
}

配置web.xml:

<servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>
            com.test.DelegatingServletProxy
        </servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/myServlet</url-pattern>
    </servlet-mapping>

這樣,我們就通過代理的方式將servlet類交給了spring進行託管,注意在web.xml中,servlet-name需要與@Component的類名保持一致,如果不一致,可以在@Component(name=”XXX”)指定名字。

相關文章