5、DelegatingFilterProxy源碼分析

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

  1. 在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()方法

相關文章
相關標籤/搜索