• 作者:老汪软件技巧
  • 发表时间:2024-08-19 17:05
  • 浏览量:

在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来安排任务,包括延迟执行和周期性执行线程管理:自动管理线程的生命周期,包括线程的创建和销毁方法概览:测试代码


@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注解