zoukankan      html  css  js  c++  java
  • 为何实现了 Filter 的类,能自动添加到 filterChain 中?

    当自定义 filter 时候,要把你的类实现 Filter 接口,或继承它的子类。然后通过 FilterRegistrationBean 注册到 filterChain 中。
    你可能没有注意这个细节,就算不做后面那一步,你的 Filter 类也能够自动添加到 filterChain 中。

    这是怎么做到的呢?在 ServletContextInitializerBeans 中,有这么一个方法:

    被标的两行,在初始过程中有特殊的行为:只要类实现 Servlet 或 Filter 接口,如果没有找到 register bean 就会自动为其创建一个 register bean,后面就会具有 servlet 或 filter 的行为。

    这个细节有什么用?

    如果你在写一个框架,并且框架中写了一个 Filter, 而不加思索地在这个类上加了 @Service 或 @Component 注解,那么它就变成了一个不可绕过的 filter. 对于框架使用者,就会很痛苦,不想用这个 filter 也不行,甚至想重写它的行为也做不到!因此,为了可扩展和兼容性,使你的框架变得更友好,最好是把它变成 bean 的半成品,不加 @Service 或 @Component 注解,后面在 configuration 中通过 @Bean 的方式定义这个 bean, 以实现可控的初始化。在定义 @Bean 的时候,可以通过 @ConditionOnMissingBean 这种注解,给客户以自定义的能力。

    // 不加 @Component
    public MyFilter implement Filter {
      //...
    }
    
    @Configuration
    public MyConfig {
    
      @ConditionOnMissingBean("myFilterBean")
      @Bean
      public MyFilter myFilterBean(){
        return new MyFilter();
      }
    
      @ConditionOnMissingBean("myFilter")
      @Bean
      public FilterRegistrationBean<MyFilter> myFilter(MyFilter myFilterBean) {
        FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<>(myFilterBean);
        registration.addUrlPatterns("/*");
        registration.setName("myFilter");
        registration.setOrder(1);
        return registration;
      } 
    }
    
  • 相关阅读:
    mybatis入门截图三
    centos 6.X 关闭selinux
    安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(二)
    安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(一)
    Linux定时任务Crontab命令详解
    CentOS 更换yum源为aliyun yum源
    CentOS7 FTP服务搭建(虚拟用户访问FTP服务)
    CentOS 7 安装Oracle 11gR2
    印度项目质量管理经验
    项目管理系列之质量管理
  • 原文地址:https://www.cnblogs.com/qkhh/p/15000515.html
Copyright © 2011-2022 走看看