【验证向】关于 @PostConstruct 注解修饰的定时器的执行次数问题在Java中,@PostConstruct
在Java中,@PostConstruct
是一个注解,用于标记在一个 bean 的初始化之后需要被调用的方法。这个注解通常与依赖注入(Dependency Injection, DI)框架一起使用,如 Spring Framework,它提供了一种在 bean 被完全构造并注入了所有依赖之后执行自定义初始化逻辑的方式。
@PostConstruct 的主要特点:
- 生命周期:
@PostConstruct
方法会在依赖注入完成之后,但在 bean 被使用之前被调用,并且它只会被调用一次 - 用途:通常用于执行一些初始化操作,比如启动时的资源加载、系统初始化等等
- 调用时机:在 bean 的构造函数、setter 方法注入依赖之后,以及
@Autowired
等注解完成依赖注入之后。 - 异常处理:
@PostConstruct
方法可以抛出异常,如果抛出异常,容器会销毁该 bean,并且不会加入到容器中
各种地方的介绍都是说 PostConstruct
只会被调用一次,那么。。真的吗?
我们今天就来验证下~
基础补充
在测试中,我们还需要用到 ScheduledExecutorService,基础不牢地动山摇~,我们先看下ScheduledExecutorService是个何方神圣 ^^/
ScheduledExecutorService
是 Java 中的一个接口,它位于 java.util.concurrent
包中。这个接口继承自 ExecutorService
,提供了一种机制,可以安排在给定的延迟后运行任务,或者周期性地执行任务。
以下是 ScheduledExecutorService
的一些关键特性和用法:
特性:
- 安排任务:可以安排任务在一次性的延迟之后执行,或者定期/周期性地执行
- 并发性:允许并发执行多个任务,是多线程编程的强大工具
- 灵活的任务调度:提供了灵活的API来安排任务,包括延迟执行和周期性执行
- 线程管理:自动管理线程的生命周期,包括线程的创建和销毁
方法概览:
schedule(Runnable command, long delay, TimeUnit unit)
: 安排在给定延迟后运行的一次性任务。schedule(Callable callable, long delay, TimeUnit unit)
: 安排在给定延迟后运行的一次性任务,该任务返回结果scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
: 首次延迟后开始周期性地执行任务,每次执行间隔为给定周期scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
: 首次延迟后开始周期性地执行任务,每次执行的延迟是自上次执行结束到下次开始的间隔
测试代码
@Service
public class Service {
@Autowired
private ScheduledExecutorService scheduledExecutorService;
@PostConstruct
public void dbBackupTimer () {
System.out.println ( "START--->" ) ;
scheduledExecutorService.scheduleAtFixedRate (() -> {
System.out.println ( "哈哈哈哈~我就是个TEST" + Instant.now() .toEpochMilli ()) ;
} , 1, 20, TimeUnit.SECONDS) ;
System.out.println ( "<---END" ) ;
}
}
执行结果
总结
由上测试不难发现虽然方法中的定时器执行了多次,但是定时器前后的输出只执行了一次,说明@PostConstruct注解修饰的方法即使在里面存在定时器的情况下也只会在程序启动时执行一次(并开启定时器),定时器则会按照配置不断执行。
@PostConstruct注解
- 可以修饰非静态方法
- 它会在服务器加载Servlet的时候运行,并且只运行一次
转载自:https://juejin.cn/post/7403659734258532363