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

RequestContextHolder

可随时获取请求与响应,不用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进行学习。都有运用