惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
Jina AI
Jina AI
WordPress大学
WordPress大学
Recent Announcements
Recent Announcements
G
Google Developers Blog
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Google DeepMind News
Google DeepMind News
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
M
MIT News - Artificial intelligence
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
Check Point Blog
J
Java Code Geeks
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Microsoft Security Blog
Microsoft Security Blog
MongoDB | Blog
MongoDB | Blog
V
Visual Studio Blog
人人都是产品经理
人人都是产品经理
量子位
A
About on SuperTechFans
D
DataBreaches.Net
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知

博客园 - 黑米

卸载 nodejs 时报错 you must be an administrator to remove this application 的解决 真心觉得,WIN11就是一个笑话 为 centos7 编译 nginx rabbitmqctl set_permissions 报错 invalid command centos7 升级 openssh (用来避坑) 你见过最长的类名是什么 记一次 k8s master 节点被 reset 后恢复的过程 java.lang.UnsupportedOperationException: null 解决 calico/node is not ready: BIRD is not ready: BGP not established with 的问题 @Transactional 和 @DSTransactional 混用可能会造成事务死锁 问题解决:idea 中无法连接 sql server 数据库,报错 [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接 用一个脚本定时清理被驱逐的pod java 里的正则表达式 如何正确填写 sonar.java.binaries 解决 Tasks support was removed in SonarQube 7.6. 的问题 部署了 prometheus, 在 target 中显示 cadvisor 与 nodes 的状态都是 down k8s 部署了 redis 集群,节点重启后,ip 变化导致集群不可用的问题 mvn deploy 到 nexus,报错 Return code is: 400, ReasonPhrase: Bad Request 关于 mybatis 的 @MapperScan 用法心得
为何实现了 Filter 的类,能自动添加到 filterChain 中?
黑米 · 2021-07-12 · via 博客园 - 黑米

当自定义 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;
  } 
}