Spring中的@PostConstruct注解使用详解

 更新时间:2023年10月31日 11:18:32   作者:wh柒八九  
这篇文章主要介绍了Spring中的@PostConstruct注解使用详解,该注解被用来修饰一个非静态的void方法,被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次,需要的朋友可以参考下

使用场景

我们在开发过程中会有这样的场景:需要在项目启动后执行一些操作,比如:读取配置文件信息,数据库连接,删除临时文件,清除缓存信息,工厂类初始化等。我们会有多种的实现方式,例如@PostConstruct 、CommandLineRunner、ApplicationRunner、ApplicationListener都可以实现在springboot启动后执行我们特定的逻辑,接下对比下他们的区别

@PostConstruct注解

该注解被用来修饰一个非静态的void方法,被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。

触发时机

SpringBoot会把标记了Bean相关注解(例如@Component、@Service、@Repository等)的类或接口自动初始化全局的单一实例,如果标记了初始化顺序会按照用户标记的顺序,否则按照默认顺序初始化。在初始化的过程中,执行完一个Bean的构造方法后会执行该Bean的@PostConstruct方法(如果有),然后初始化下一个Bean。

spring中bean的创建过程

配置Bean(@Component、@Service、@Controller等注解配置) -----> 解析为Bean的元数据(Bean容器中的BeanDefinition对象) --> 根据Bean的元数据生成Bean(创建bean)

创建bean的时候执行顺序

Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

程序使用实例

package com.wideth.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;

@Slf4j
@Component
public class PostConstructConfig {

    @PostConstruct
    public void myPostConstruct(){

        log.info("=============>>>myPostConstruct方法init");
    }
}

在这里插入图片描述

优缺点

优点

  • 使用简单,在spring容器管理的类中添加此注解即可

缺点

  • 在spring创建bean的时候触发,此时容器还未完全初始化完毕,如果逻辑中引用了还未完成初始化的bean会导致异常 ,所以需要考虑加载顺序。
  • 如果@PostConstruct方法内的逻辑处理时间较长,就会增加SpringBoot应用初始化Bean的时间,进而增加应用启动的时间。因为只有在Bean初始化完成后,SpringBoot应用才会打开端口提供服务,所以在此之前,应用不可访问。

到此这篇关于Spring中的@PostConstruct注解使用详解的文章就介绍到这了,更多相关@PostConstruct注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 关于logback日志级别动态切换的四种方式

    关于logback日志级别动态切换的四种方式

    这篇文章主要介绍了关于logback日志级别动态切换的四种方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • java实现简易版图形界面计算器

    java实现简易版图形界面计算器

    这篇文章主要为大家详细介绍了java实现简易版图形界面计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • jdbc实现连接和增删改查功能

    jdbc实现连接和增删改查功能

    这篇文章主要为大家详细介绍了jdbc实现连接和基本的增删改查功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-02-02
  • SpringMVC的Body参数拦截的问题

    SpringMVC的Body参数拦截的问题

    SpringMVC对出参和入参有非常友好的拓展支持,方便你对数据的输入和输出有更大的执行权,我们如何通过SpringMVC定义的结果做一系列处理呢,需要的朋友可以参考下
    2018-06-06
  • Spring AOP常见使用场景、术语及设计模式应用方式

    Spring AOP常见使用场景、术语及设计模式应用方式

    AOP是一种编程思想,可以将横切关注点从业务逻辑中分离出来,以便更好地管理和维护,它通过使用Aspect、JoinPoint、Advice等术语来实现,代理、装饰器和拦截器等设计模式在AOP中经常被使用
    2024-12-12
  • java高级用法之JNA中的Structure

    java高级用法之JNA中的Structure

    这篇文章主要介绍了java高级用法之JNA中的Structure,JNA提供了Structure类,来帮助我们进行这些映射处理,下面文章详细的介绍过程需要的小伙伴可以参考一下
    2022-04-04
  • Springboot项目如何使用apollo配置中心

    Springboot项目如何使用apollo配置中心

    这篇文章主要介绍了Springboot项目如何使用apollo配置中心,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java调用ffmpeg实现视频转换的方法

    java调用ffmpeg实现视频转换的方法

    这篇文章主要介绍了java调用ffmpeg实现视频转换的方法,较为详细分析了java视频格式转换所需要的步骤及具体实现技巧,需要的朋友可以参考下
    2015-06-06
  • SpringBoot Seata 死锁问题排查记录

    SpringBoot Seata 死锁问题排查记录

    这篇文章主要介绍了SpringBoot Seata 死锁问题排查,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-12-12
  • package打包一个springcloud项目的某个微服务报错问题

    package打包一个springcloud项目的某个微服务报错问题

    这篇文章主要介绍了package打包一个springcloud项目的某个微服务报错问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07

最新评论