OncePerRequestFilter(过滤器Filter)

Spring针对Servlet原生过滤器Filter的进一步封装。通过继承OncePerRequestFilter,可以自定义一个过滤器,且每个请求都会执行一次。关于重写方法,initdoFilter作为默认实现,有final修饰,我们想进行扩展,需要重写initFilterBeandoFilterInternal

1
2
// 重写doFilterInternal进行业务扩展,别忘了最后进行过滤链调用
filterChain.doFilter(request, response);

HandlerInterceptorAdapter(拦截器Interceptor)

HandlerInterceptorAdapter是Spring提供的一种拦截器适配器,通过继承该抽象类自定义拦截器。

主要实现三个接口:preHandlepostHandleafterCompletion

1
2
3
preHandle:前置处理,Controller执行前
postHandle:后置处理,Controller执行完成,可以根据方法参数modelAndView操作渲染视图
afterCompletion:请求回调完毕,可进行资源释放,比如处理Filter中set的ThreadLocal

自定义配置类,将拦截器加入调用链路,实现WebMvcConfigurer或WebMvcConfigurationSupport进行实现

WebMvcConfigurer可以进行多实现,WebMvcConfigurationSupport多实现会产生冲突

自定义SpringBoot默认MVC配置?好几个坑,避一避 - 知乎 (zhihu.com)

1
2
3
4
WebMvcAutoConfiguration WebMvcConfigurationSupport默认实现DelegatingWebMvcConfiguration,Delegating会把所有WebMvcConfigurer的实现进行遍历,然后加入配置。
自己实现会覆盖DelegatingWebMvcConfiguration的操作,导致WebMvcConfigurer的实现被忽略

有个疑问,为什么DelegatingWebMvcConfiguration 这个实现类一定晚于WebMvcAutoConfiguration 被注入,它不是也被@configuration修饰了吗。也就DelegatingWebMvcConfiguration 和我们自己的实现类在注入时先后顺序到底有何差异,为什么spring能保证WebMvcAutoConfiguration 注入时WebMvcAutoConfiguration 一定没有被注入

RequestContextHolders

可随时获取请求与响应,不用controller层往下传。

可自行封装http工具类,eg:https://www.jianshu.com/p/83a872d8db92

MDC

分布式日志?

TransmittableThreadLocal(解决异步上下文传递问题)

AOP动态代理,this引用不代理则失效

SmartInitializingSingleton (后置处理解决循环依赖)

HandlerMethodArgumentResolver (自定义接收前端传参实现)

https://blog.csdn.net/dear_little_bear/article/details/104565425

WebDataBinder 参数转换

WebMvcConfigurer

@AliasFor(别名,封装注解)

@EventListener spring事件监听机制

@Import 实现配置链式加载

配置链式加载,多个配置类链式引用,第一个被注入后,后面配置进行链式加载

Controller层接口定义为什么必须是public

接口调用servlet初始化是代理对象,public在后续调用链上会走aop代理增强,注入容器管理的类,private方法则不会。所以private方法被调用时用的是代理对象,代理对象是中自动注入的属性都是null,引发空指针。

Querydsl for JPA

http://querydsl.com/static/querydsl/latest/reference/html/ch02.html

1
2
3
@LastModifiedBy
@EntityListeners(AuditingEntityListener.class)
上述注解组合可以自动更新修改人,使用querydsl更新数据是否也会自动更新?

自定义starter,如何自动装配

SpringBoot自定义日志Starter,可动态拔插配置 - 掘金 (juejin.cn)

1
2
3
4
5
6
7
8
starter中配置统一用一个配置类集中注入

显示注入:自定义@EnableXXX注解,@import 导入 ImportSelector实现类,实现类selectImports返回需要装配的配置类。最后启用注解即可功能生效

隐式注入:resources -> META-INF -> spring.factories,
其中配置org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 转行写自己的配置类

这两种实现都可以看spring官方的starter进行学习。都有运用

UriComponentsBuilder

https://www.baeldung.com/spring-uricomponentsbuilder

位图BitMap

二进制位代表多种类型组合,存储int型即可

例如业务产品涉及类型A B C D E。10101,00011,01010 则对应ACE、DE、BD这三种组合。存储值对应21、3、10

基础适用场景,多组合优惠卷、多固定标签、签到。