http请求在handler中的执行顺序:
前端发送请求---->preHandler---->afterConcurrentHandlingStarted----->Controller----->postHandle---->afterCompletion---->返回请求
HandlerInterceptorAdapter一般做一些登陆拦截。
package org.springframework.web.servlet.handler;
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {
// 默认构造函数
public HandlerInterceptorAdapter() {
}
/** 预处理回调⽅法,实现处理器的预处理(例如登录校验) 第三个参数为响应的处理器,⼀般是⾃定
义的Controller
* 返回值:true 表示继续流程,如调⽤下⼀个拦截器或者是处理器;false表示流程中断,不会再
调⽤其他的响应器 * 或者处理器
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
/** 后处理回调⽅法,实现处理器的后处理(但是在渲染视图之前),此时我们可以通过
ModelAndView对模型数据进⾏
* 处理或者对视图进⾏处理。
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws
Exception {
}
/** 整个请求处理完毕回调⽅法,即在视图渲染完毕时回调,⽐如性能监控中我们可以在此记录结束时
间并输出消耗时间
* 还可以进⾏⼀些资源的清理,类似于try...catch...finally中的finally。
*/
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, @Nullable Exception ex) throws
Exception {
}
/**
* 不是HandlerInterceptor的接⼝实现,是AsyncHandlerInterceptor的,
AsyncHandlerInterceptor实现了HandlerInterceptor
在有异步请求时触发,在preHandle返回true之后才执⾏这⾥,这⾥执⾏完成之后会触发
postHandle和afterCompletion
*/
public void afterConcurrentHandlingStarted(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
}
}
SPI全称Service Provider Interface,服务发现机制,是Java提供的一套用来被第三方实现或者扩展的接口,它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。
这种动态装配有什么用呢?
可以把CatService理解为JDBC的接口,JDBC是Java为连接数据库定义的规范。
而WriteCatService和BlackCatService分别代表mysql连接和Oracle连接的实现类。
在导包的时候会导入mysql的驱动类:
看一下mysql的驱动类中都有些什么:
在这个包里面实现了JDBC的一些接口。
示例: