在 boot 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时 任务处理器**@Scheduled**注解,另一种就是使用第三方框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策略,当然也支持 Quartz(不做过多介绍)。
定时任务 @Scheduled
java
@Configuration //1.主要用于标记配置类
@EnableScheduling // 2.开启定时任务
public class SaticScheduleTask {
@Resource
UserService userService;
//3.添加定时任务 每隔5秒调用一次
@Scheduled(cron = "0/5 * * * * ?")
public void configureTasks() {
userService.addUser();
System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
}
}
cron = [秒] [分] [小时] [日] [月] [周] [年]
月份中的日期和星期可能会起冲突,因此在配置时这两个得有一个是 ?
拦截器
SpringMvc的处理拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理,开 发可以自己定义一些拦截器来实现特定功能。
过滤器与拦截器的区别
过滤器:
- servlet规范中的一部分,任何java web程序都可以使用。
- 在url-pattern中配置之后,可以对所要访问的资源进行拦截。
拦截器:
- 拦截器在SpringMvc框架自己的,只有使用了SpringMvc框架工程才能使用。
- 拦截器只会拦截访问控制器的方法,如果访问的是js,css,image...是不会进行拦截的。
SpringBoot中使用拦截器
- 实现HandlerInterceptor接口
java
@Component
public class LoginInterceptor implements HandlerInterceptor {
//preHandle是请求执行前执行的
@Override
public boolean preHandle(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("进入拦截器");
return true;
}
//postHandler是请求结束执行的 当preHandle返回true才会执行
public void postHandle.....
//afterCompletion是视图渲染完成后才执行
public void afterCompletion.....
}
2.实现WebMvcConfigurer接口配置拦截路径
三种方式:
- 继承WebMvcConfigurerAdapter spring5.0 以弃用,不推荐
- 实现WebMvcConfigurer 推荐
- 继承WebMvcConfigurationSupport 会导致springboot自动配置失效
java
@Configuration
public class WebJavaBeanConfiguration implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/user/login")
.excludePathPatterns("/user/logout");
}
}
addInterceptor:需要一个实现HandlerInterceptor接口的拦截器实例
addPathPatterns:用于设置拦截器的过滤路径规则
addPathPatterns("/**")对所有请求都拦截
excludePathPatterns:用于设置不需要拦截的过滤规则
拦截器主要用途:进行用户登录状态的拦截,日志的拦截等