DelegatingFilterProxy源碼分析
複製代碼
DelegatingFilterProxyhtml
org.springframework.web.filter.DelegatingFilterProxyweb
能夠看出 DelegatingFilterProxy 類繼承 GenericFilterBean,間接實現了Filter這個接口,故而該類屬於一個過濾器。那麼就會有實現Filter中 init、doFilter、destroy三個方法。spring
filter簡介:www.cnblogs.com/xdp-gacl/p/…markdown
GenericFilterBean中實現 filter中 init方法: 最後調用了app
this.initFilterBean();oop
protected void initFilterBean() throws ServletException {
}
複製代碼
如今盯住 initFilterBean() 就ok了源碼分析
public class DelegatingFilterProxy extends GenericFilterBean {
private String contextAttribute;
private WebApplicationContext webApplicationContext;
private String targetBeanName;
private boolean targetFilterLifecycle;
private volatile Filter delegate;
private final Object delegateMonitor;
...
protected void initFilterBean() throws ServletException {
Object var1 = this.delegateMonitor;
synchronized(this.delegateMonitor) {
if(this.delegate == null) {
if(this.targetBeanName == null) {
this.targetBeanName = this.getFilterName();
}
WebApplicationContext wac = this.findWebApplicationContext();
if(wac != null) {
this.delegate = this.initDelegate(wac);
}
}
}
}
...
}
複製代碼
在DelegatingFilterProxy 中繼承GenericFilterBean 重寫initFilterBean(),如今就能夠解釋 若是不想用 filter-name: shiroFilter 也能夠用 targerBeanName 的value 這句話了ui
- 在spring容器中去找與 filter-name 相同名字的 bean實例 若是沒有設置 targetBeanName 他會默認去加載 filter-name 名字同樣的實例initFilterBean()
一、找到被代理類在spring中配置的id並賦值給targetBeanName。this
二、使用找到的id從spring容器中找到具體被代理的類,並賦值給delegateurl
<!--Shiro過濾器-->
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>targetBeanName</param-name>
<param-value>shiroFilter22</param-value>
</init-param>
</filter>
複製代碼
DelegatingFilterProxy
private String targetBeanName; private boolean targetFilterLifecycle; private volatile Filter delegate;
getFilterName()該方法的做用是,獲取被代理的filter在spring中配置的id
private volatile Filter delegate; 獲取過濾器
initDelegate()該方法的做用是,從spring容器中獲取到具體被代理的filter
執行doFilter()
invokeDelegate方法的做用就是執行被代理filter的doFilter方法
private boolean targetFilterLifecycle; 默認爲false 判斷targetFilterLifecycle屬性是false仍是true,決定是否調用自定義類的init()、destry()方法