Spring MVC过滤器-超类 GenericFilterBean

GenericFilterBean

    抽象类GenericFilterBean实现了javax.servlet.Filter、org.springframework.beans.factory.BeanNameAware、org.springframework.context.EnvironmentAware、org.springframework.web.context.ServletContextAware、org.springframework.beans.factory.InitializingBean和org.springframework.beans.factory.DisposableBean五个接口,作用如下:

    (1) Filter,实现过滤器;

    (2) BeanNameAware,实现该接口的setBeanName方法,便于Bean管理器生成Bean;

    (3) EnvironmentAware,实现该接口的setEnvironment方法,指明该Bean运行的环境;

    (4) ServletContextAware,实现该接口的setServletContextAware方法,指明上下文;

    (5) InitializingBean,实现该接口的afterPropertiesSet方法,指明设置属性生的操作;

    (6) DisposableBean,实现该接口的destroy方法,用于回收资源。

    GenericFilterBean的工作流程是:init-doFilter-destory,其中的init和destory在该类中实现,doFilter在具体实现类中实现。init的代码如下:

/**
* Standard way of initializing this filter.
* Map config parameters onto bean properties of this filter, and
* invoke subclass initialization.
* @param filterConfig the configuration for this filter
* @throws ServletException if bean properties are invalid (or required
* properties are missing), or if subclass initialization fails.
* @see #initFilterBean
*/
public final void init(FilterConfig filterConfig) throws ServletException {
Assert.notNull(filterConfig, “FilterConfig must not be null”);
if (logger.isDebugEnabled()) {
logger.debug(“Initializing filter '” + filterConfig.getFilterName() + “’”);
}

    this.filterConfig = filterConfig;  

    // Set bean properties from init parameters.  
    try {  
        PropertyValues pvs = new FilterConfigPropertyValues(filterConfig, this.requiredProperties);  
        BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);  
        ResourceLoader resourceLoader = new ServletContextResourceLoader(filterConfig.getServletContext());  
        bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));  
        initBeanWrapper(bw);  
        bw.setPropertyValues(pvs, true);  
    }  
    catch (BeansException ex) {  
        String msg = "Failed to set bean properties on filter '" +  
            filterConfig.getFilterName() + "': " + ex.getMessage();  
        logger.error(msg, ex);  
        throw new NestedServletException(msg, ex);  
    }  

    // Let subclasses do whatever initialization they like.  
    initFilterBean();  

    if (logger.isDebugEnabled()) {  
        logger.debug("Filter '" + filterConfig.getFilterName() + "' configured successfully");  
    }  
}  

该方法来自于javax.servlet.Filter,即过滤器的初始化,它的主要工作集中于以下几行代码:

// 从properties文件中获取值,这里是web.xml
PropertyValues pvs = new FilterConfigPropertyValues(filterConfig, this.requiredProperties);
// 设置bean适配器
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
// 设置上下文,这里的servletContext的设定继承自ServletContextAware的setter
ResourceLoader resourceLoader = new ServletContextResourceLoader(filterConfig.getServletContext());
// 将上下文信息和环境信息设置到bean适配器中,这里的environment来自于EnvironmentAware的setter
bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, this.environment));
// 初始化bean适配器
initBeanWrapper(bw);
// 将从properties中获取的资源放置到bean适配器
bw.setPropertyValues(pvs, true);
// 初始化bean
initFilterBean();
其中initFilterBean方法在两个位置起作用,一处是上文所述的init方法,另一处是afterPropertiesSet方法,在调用该方法前,需要保证用于Filter的所有的bean都已被设置,该方法由子类实现。

    GenericFilterBean中包含一个内部私有类FilterConfigPropertyValues,主要用于将web.xml中定义的init-param的值取出。
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值