程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Spring源碼分析-DelegatingFilterProxy

Spring源碼分析-DelegatingFilterProxy

編輯:關於JAVA
 

在開發web項目時,經常需要添加自己的filter,在web.xml文件中一般都這麼定義自己的filter,filter的name是自己定義的beanName,class一般都是使用org.springframework.web.filter.DelegatingFilterProxy。 配置如下:
<filter>
<filter-name>userInfoFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
<filter-name>userInfoFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

DelegatingFilterProxy 是Spring的一個類,它實現了GenericFilterBean,而GenericFilterBean又實現了javax.servlet.Filter接口,並對Filter的init方法進行了重寫,而Filter的doFilter交給其子類去實現。而GenericFilterBean的init方法內部調用了GenericFilterBean的initFilterBean方法。該方法的默認實現為空,其采用了模板方法的設計模式交給其子類去實現initFilterBean的具體邏輯。
public final void init(FilterConfig filterConfig) throws ServletException {
//...此處省略部分代碼
// Let subclasses do whatever initialization they like
initFilterBean();
//...此處省略部分代碼
}

現在,來看看DelegatingFilterProxy的initFilterBean的現實代碼
@Override
protected void initFilterBean() throws ServletException {
synchronized (this.delegateMonitor) {
if (this.delegate == null) {
// If no target bean name specified, use filter name.
if (this.targetBeanName == null) {
this.targetBeanName = getFilterName();
}
// Fetch Spring root application context and initialize the delegate early,
// if possible. If the root application context will be started after this
// filter proxy, we'll have to resort to lazy initialization.
WebApplicationContext wac = findWebApplicationContext();
if (wac != null) {
this.delegate = initDelegate(wac);
}
}
}
}

該方法中有兩處關鍵的地方this.targetBeanName = getFilterName()與WebApplicationContext wac = findWebApplicationContext()。前者得到web.xml中filter對應的名字,將其賦予為targetBeanName;後者 得到一個WebApplicationContex對象,這個接口大家應該很熟悉其續承了ApplicationContext,而通過其getBean方法我們便可以得到在application-context.xml配置文件中配置的bean。 先來看看 initDelegate對應的代碼:
protected Filter initDelegate(WebApplicationContext wac) throws ServletException {
Filter delegate = wac.getBean(getTargetBeanName(), Filter.class);
if (isTargetFilterLifecycle()) {
delegate.init(getFilterConfig());
}
return delegate;
}

Filter delegate = wac.getBean(getTargetBeanName(), Filter.class),便是利用我們在web.xml配置文件設置的<filter-name>userInfoFilter</filter-name>去application-context.xml配置文件中找到具體的實現類。 所以,在application-context.xml文件中bean對應的id一定要與web.xml中的filter-name一致。

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved