@PostConstruct在项目启动时被执行两次或多次的原因及分析

 更新时间:2021年08月03日 11:33:22   作者:yinyan1314  
这篇文章主要介绍了@PostConstruct在项目启动时被执行两次或多次的原因及分析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

@PostConstruct项目启动时被执行两次或多次

原因

是因为文件对@PostConstruct所在类扫描了两次!

首先排查,带有扫描包配置(context:component-scan)的同一spring文件,是否在web.xml配置中,初始化就执行的那种配置(比如context-param,init-param),被重复的配置了两遍。

然后在排查,web.xml中配置了初始化配置的多个spring文件是否都扫描了@PostConstruct所在类的所在包!常见SpringMVC文件的扫描路径中也包含了@PostConstruct所在类的所在包。

@PostConstruct执行顺序

最近看到@PostConstruct这个注解,思考一个问题,这个注释是修饰初始化之后需要执行的方法,那么@PostConstruct和@Autowired、构造函数的执行顺序是什么呢?

写了段代码验证一下

@Service
public class BeanA {
    @Autowired
    private BeanB beanB;
    public BeanA() {
        System.out.println("这是Bean A 的构造方法");
    }
    @PostConstruct
    private void init() {
        System.out.println("这是BeanA的 init 方法");
        beanB.testB();
    }
}
@Service
public class BeanB {
    @PostConstruct
    private void init() {
        System.out.println("这是BeanB 的init 方法");
    }
    public BeanB() {
        System.out.println("这是Bean B的 构造方法");
    }
    void testB() {
        System.out.println("这是Bean B 的 testB 方法");
    }
}

启动后输出:

这是Bean A 的构造方法
这是Bean B的 构造方法
这是BeanB 的init 方法
这是BeanA的 init 方法
这是Bean B 的 testB 方法

所以得到结论: 构造方法 > @Autowired > @PostConstruct

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java transient 关键字详解及实例代码

    Java transient 关键字详解及实例代码

    本文章向大家介绍Java transient关键字的使用方法和实例,包括的知识点有transient的作用、transient使用小结、transient使用细节,需要的朋友可以参考一下
    2016-12-12
  • Java二叉树路径和代码示例

    Java二叉树路径和代码示例

    这篇文章主要介绍了Java二叉树路径和代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • Mybatis实战之TypeHandler高级进阶

    Mybatis实战之TypeHandler高级进阶

    本文主要介绍了自定义的枚举TypeHandler的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • Java导出oracle表结构实例详解

    Java导出oracle表结构实例详解

    这篇文章主要介绍了 Java导出oracle表结构实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • IDEA Eval Reset 使用方法汇总

    IDEA Eval Reset 使用方法汇总

    本文给大家介绍了IDEA Eval Reset 使用方法,安装插件包括离线安装方式和在线安装方式,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2023-10-10
  • Maven中的库repository详解

    Maven中的库repository详解

    Maven中要配置库,可以有多种方式,最直接的是在项目中的pom.xml文件中,通过<repositories>配置库,这样配置的库仅适用于当前项目,这篇文章主要介绍了Maven中的库(repository),需要的朋友可以参考下
    2024-01-01
  • Spring Boot定时器创建及使用解析

    Spring Boot定时器创建及使用解析

    这篇文章主要介绍了Spring Boot定时器创建及使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot整合JdbcTemplate的示例代码

    SpringBoot整合JdbcTemplate的示例代码

    JdbcTemplate是Spring框架自带的对JDBC操作的封装,目的是提供统一的模板方法使对数据库的操作更加方便、友好,效率也不错,这篇文章主要介绍了SpringBoot整合JdbcTemplate,需要的朋友可以参考下
    2022-08-08
  • Java实现FutureTask的示例详解

    Java实现FutureTask的示例详解

    在并发编程当中我们最常见的需求就是启动一个线程执行一个函数去完成我们的需求,而在这种需求当中,我们需要函数有返回值。Java给我们提供了这种机制,去实现这一个效果:FutureTask。本文为大家准备了Java实现FutureTask的示例代码,需要的可以参考一下
    2022-08-08
  • mybatis xml文件热加载实现示例详解

    mybatis xml文件热加载实现示例详解

    这篇文章主要为大家介绍了mybatis xml文件热加载实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03

最新评论