一、需求说明
现在项目中有个页面加载方法,需要在查询后执行插入,但是插入数据的部分只会在Web项目启动后第一次请求才会执行
代码如下:
@Controller
public class VideoController {
@RequestMapping("/getVideo/{videoId}")
public void getVideo(HttpServletRequest request, HttpServletResponse response, @PathVariable String videoId) {
// 每次都执行的部分
System.out.println("执行查询操作");
// 只在整个项目启动后接到第一次请求后执行
System.out.println("执行插入操作");
}
}
二、问题解决
开始想的办法是利用单例的初始化来实现,不过这样还得再写一个类,有点麻烦
后面想能否通过一个变量来进行标识:首先这个变量不能写在方法内部,因为方法内部的话,变量的值每次都会被重新定义一遍,这不是我想要的;那么就只能定义在类上面,但是spring中的controller是单例,这里需要考虑并发问题
这里我想到了使用java并发包里的AtomicBoolean类,上面的代码改成:
@Controller
public class VideoController {
private AtomicBoolean hasRunAtom = new AtomicBoolean(false);
@RequestMapping("/getVideo/{videoId}")
public void getVideo(HttpServletRequest request, HttpServletResponse response, @PathVariable String videoId) {
// 每次都执行的部分
System.out.println("执行查询操作");
// 只在整个项目启动后接到第一次请求后执行
if (hasRunAtom.compareAndSet(false, true)) {
System.out.println("执行插入操作");
}
}
}
这样就ok了
说明:因为springmvc中Controller默认是单例的,所以我觉得hasRunAtom定义成实例变量就可以了,你要定义成静态的也没问题;如果你的Controller是多例的,那就必须把hasRunAtom定义成静态变量。
https://www.cnblogs.com/sqw8080/p/10901516.html