Spring中的@PostConstruct注解使用方法解析

 更新时间:2023年11月02日 10:38:32   作者:我的龙呢  
这篇文章主要介绍了Spring中的@PostConstruct注解使用方法解析,@PostConstruct注解是用来处理在@Autowired注入属性后init()方法之前,对一些零散的属性进行赋值的注解,需要的朋友可以参考下

一 @PostConstruct注解的来由

构造方法和@Autowired注解

一般情况下我们大多用@Autowired来完成某个类中的属性的注入。 @Autowired这个注解在构造方法执行后执行,以如下为例:就是在通过构造方法生成FileTaskExecutor 和FileTaskHandlerFactory这两个对象后,再把生成的这个FileTaskHandlerFactory对象赋值到FileTaskExecutor 中的fileTaskHandlerFactory属性上。 有点类似set方法。

@Component("backendFileTaskExecutor")
public class FileTaskExecutor {
   @Autowired
    private FileTaskHandlerFactory fileTaskHandlerFactory;
}

二 @PostConstruct注解

1 从需求方面讲解@PostConstruct注解的来由

@Autowired这个注解能解决一部分复杂功能的属性的赋值,当时对于一些比较零散的初始值的创建,用@Autowired这个注解就有点多余了,因为像如下:BlockingQueue<FileTaskDTO>,Executor ,Limiter ,Map<Long, FileTaskDTO>这些属性我只想简单的new一个对象或是赋值一个固定值,这个时候我们还要单独的创建一个类(这个类里面单单只是new一个对象,或者设置一个固定值)然后再用@Autowired注入属性,这样操作就有点鸡肋了。

@Component("backendFileTaskExecutor")
public class FileTaskExecutor {
   @Autowired
    private FileTaskHandlerFactory fileTaskHandlerFactory;

	private BlockingQueue<FileTaskDTO> taskQueue;
    private Executor executor;
    private Limiter limiter;
    private Map<Long, FileTaskDTO> handlingTask;

	@PostConstruct
    public void initParams() {
        taskQueue = new ArrayBlockingQueue<>(MAX_POOL_TASK_SIZE);
        handlingTask = new ConcurrentHashMap<>();
        limiter = new Limiter(configService.getMaxPermitUsers(), configService.getMaxPermitPerUserTasks());
        executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
        executor.execute(new Boss());
        cleanTempFile();
    }
}

所以@PostConstruct这个注解就诞生了,它就是用来处理在@Autowired注入属性后init()方法之前,对一些零散的属性进行赋值的注解。 如上面被@PostConstruct修饰的的initParams()方法。

2 @PostConstruct

  1. 除了拦截器这个特殊情况以外,其他情况都不允许有参数,否则spring框架会报IllegalStateException;而且返回值要是void,但实际也可以有返回值,至少不会报错,只会忽略
  2. 方法随便你用什么权限来修饰,public、protected、private都可以,反正功能是由反射来实现
  3. 方法不可以是static的,但可以是final的

所以,综上所述,在spring项目中,在一个bean的初始化过程中,方法执行先后顺序为

Constructor > @Autowired > @PostConstruct

先执行完构造方法,再注入依赖,最后执行初始化操作,所以这个注解就避免了一些需要在构造方法里使用依赖组件的尴尬。

在这里插入图片描述

3 其它将属性注入bean对象的方法

  • 定义静态常量。
  • Constructor
  • @Autowired
  • @PostConstruct注解
  • 实现InitializingBean接口重写afterPropertiesSet()方法
  • 实现CommandLineRunner或者ApplicationRunner接口,他们在容器启动后启动

值得注意的是第4个是在tomcat服务启动之后才开始的。第3个是在spring容器启动之后,bean对象的构造方法完成后启动的。 他们具有如下关系:

spring容器启动 > Constructor > @Autowired > @PostConstruct > InitializingBean > CommandLineRunner或者ApplicationRunner`接口

注意:bean对象的初始化是挨个进行的(上一个完成才能进行下一个),如果某个bean对象中的@PostConstruct方法内的逻辑处理过长就会导致spring的启动时间边长,因为只有在所有的bean对象初始化完成之后springBoot才会打开端口提供服务。 如果出现如上问题的化可以采用实现CommandLineRunner或者ApplicationRunner接口的方法来注入一些数据,因为这一步是在springboot启动完成之后在运行的

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

相关文章

  • Java简单验证身份证功能示例

    Java简单验证身份证功能示例

    这篇文章主要介绍了Java简单验证身份证功能,涉及java针对字符串的截取、判断相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • Java删除ArrayList中的重复元素的两种方法

    Java删除ArrayList中的重复元素的两种方法

    在Java编程中,ArrayList是一种常用的集合类,它允许我们存储一组元素,在某些情况下,我们可能需要移除其中重复的元素,只保留唯一的元素,下面介绍两种常见的删除ArrayList中重复元素的方法,需要的朋友可以参考下
    2024-12-12
  • Java gRPC拦截器简单实现分布式日志链路追踪器过程详解

    Java gRPC拦截器简单实现分布式日志链路追踪器过程详解

    有请求的发送、处理,当然就会有拦截器的需求,例如在服务端通过拦截器统一进行请求认证等操作,这些就需要拦截器来完成,今天松哥先和小伙伴们来聊一聊gRPC中拦截器的基本用法,后面我再整一篇文章和小伙伴们做一个基于拦截器实现的JWT认证的gRPC
    2023-03-03
  • Java将Word转换成PDF的常用用法

    Java将Word转换成PDF的常用用法

    Java开发人员在处理文档转换时,常常需要将Word或Excel文档转换为PDF格式,以便于更好地保持格式一致性、便于分发和打印,这篇文章主要给大家介绍了关于Java将Word转换成PDF的常用用法,需要的朋友可以参考下
    2024-08-08
  • Java未赋值变量的初始值解析(默认值)

    Java未赋值变量的初始值解析(默认值)

    这篇文章主要介绍了Java未赋值变量的初始值(默认值),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • HandlerMapping之RequestMappingHandlerMapping作用详解

    HandlerMapping之RequestMappingHandlerMapping作用详解

    这篇文章主要介绍了HandlerMapping之RequestMappingHandlerMapping作用详解,HandlerMapping是用来寻找Handler的,并不与Handler的类型或者实现绑定,而是根据需要定义的,那么为什么要单独给@RequestMapping实现一个HandlerMapping,需要的朋友可以参考下
    2023-10-10
  • java开发AOP基础JdkDynamicAopProxy

    java开发AOP基础JdkDynamicAopProxy

    这篇文章主要为大家介绍了java开发AOP基础JdkDynamicAopProxy源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • Java 单元测试之Mockito 模拟静态方法与私有方法最佳实践

    Java 单元测试之Mockito 模拟静态方法与私有方法最佳实践

    本文将深入探讨如何使用 Mockito 来模拟静态方法和私有方法,结合大量实战代码示例,带你突破传统单元测试的边界,写出更彻底、更独立、更具可读性的测试用例,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • Java中堆和栈的区别详解

    Java中堆和栈的区别详解

    这篇文章主要介绍了Java中堆和栈的区别详解,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚拟)内存中的堆和栈,需要的朋友可以参考下
    2015-01-01
  • JAVAlogback日志管理详解

    JAVAlogback日志管理详解

    本篇文章主要介绍了在SpringBoot中使用Logback管理记录日志,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09

最新评论