关于@PostConstruct

关于@PostConstruct关于 PostConstruc 注解的理解一 PostConstruc 注解的来由一构造方法和 Autowired 注解二 PostConstruc 注解 1 从需求方面讲解 PostConstruc 注解的来由 2 PostConstruc 一 PostConstruc 注解的来由一构造方法和 Autowired 注解一般情况下我们大多用 Autowired 来完成某个类中的属性的注入 Autowired 这个注解在构造方法执行后执行 以如下为例 就是在通过构造方法生成 FileTaskExec

一 @PostConstruct注解的来由

一 构造方法和@Autowired注解

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




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

二 @PostConstruct注解

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

@Autowired这个注解能解决一部分复杂功能的属性的赋值,当时对于一些比较零散的初始值的创建,用@Autowired这个注解就有点多余了,因为像如下:BlockingQueue

,Executor ,Limiter ,Map

这些属性我只想简单的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(); } } 

2 @PostConstruct

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

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

Constructor > @Autowired > @PostConstruct

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178476.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午5:12
下一篇 2026年3月26日 下午5:13


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号