springmvc的controller中有些代码只在项目启动后接到第一次请求才执行

4 篇文章 0 订阅
2 篇文章 0 订阅

一、需求说明

现在项目中有个页面加载方法,需要在查询后执行插入,但是插入数据的部分只会在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://stackoverflow.com/questions/11382342/call-a-block-of-a-method-only-for-the-first-call-of-the-method

https://www.cnblogs.com/sqw8080/p/10901516.html

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值