@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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
SpringBoot @PostConstruct原理用法解析
前言 本节我们将学习一下@PostConstruct的用法. 概述 @PostContruct是spring框架的注解,在方法上加该注解会在项目启动的时候执行该方法,也可以理解为在spring容器初始化的时候执行该方法. /** * 项目启动时,初始化定时器 */ @PostConstruct public void init() { List<Job> jobList = jobDao.selectJobAll(); for (Job job : jobList) { CronTrigger
-
Spring实战之使用@POSTConstruct和@PreDestroy定制生命周期行为操作示例
本文实例讲述了Spring实战之使用@POSTConstruct和@PreDestroy定制生命周期行为操作.分享给大家供大家参考,具体如下: 一 配置 <?xml version="1.0" encoding="GBK"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLS
-
Spring定时任务中@PostConstruct被多次执行异常的分析与解决
发现问题 最近在项目中刚刚修改一个功能,代码正准备验证,启动Idea的debug模式,运行项目,发现启动失败,查看日志发现定时任务被重复执行,导致异常.debug定时任务的初始化类,发现启动定时任务是在@PostConstruct方法中执行的,网上查询,有说Spring在某种情况下初始化有bug,注解@Component可能出现多次执行.把@Component修改为@Service就行了! 结果我改了也没解决问题! 无赖更一步跟进日志,发现以下内容: [ERROR][2017-06-20 19:
-
@PostConstruct在项目启动时被执行两次或多次的原因及分析
@PostConstruct项目启动时被执行两次或多次 原因 是因为文件对@PostConstruct所在类扫描了两次! 首先排查,带有扫描包配置(context:component-scan)的同一spring文件,是否在web.xml配置中,初始化就执行的那种配置(比如context-param,init-param),被重复的配置了两遍. 然后在排查,web.xml中配置了初始化配置的多个spring文件是否都扫描了@PostConstruct所在类的所在包!常见SpringMVC文件的扫
-
java如何实现项目启动时执行指定方法
本文实例为大家分享了java项目启动时执行指定方法,供大家参考,具体内容如下 想到的就是监听步骤如下: 1.配置web.xml <listener> <listener-class>com.listener.InitListener</listener-class> </listener> 2.编写InitListener类 package com.listener; import java.io.File; import javax.servlet.Ser
-
SpringBoot启动时自动执行代码的几种实现方式
目录 前言 java自身的启动时加载方式 static代码块 构造方法 Spring启动时加载方式 代码测试 总结 前言 目前开发的SpringBoot项目在启动的时候需要预加载一些资源.而如何实现启动过程中执行代码,或启动成功后执行,是有很多种方式可以选择,我们可以在static代码块中实现,也可以在构造方法里实现,也可以使用@PostConstruct注解实现. 当然也可以去实现Spring的ApplicationRunner与CommandLineRunner接口去实现启动后运行的功能.在
-
SpringBoot项目启动时如何读取配置以及初始化资源
介绍 在开发过程中,我们有时候会遇到非接口调用而出发程序执行任务的一些场景,比如我们使用quartz定时框架通过配置文件来启动定时任务时,或者一些初始化资源场景等触发的任务执行场景. 方法一:注解 方案 通过使用注解@Configuration和@Bean来初始化资源,配置文件当然还是通过@Value进行注入. @Configuration:用于定义配置类,可替换xml配置文件,被注解的类内部一般是包含了一个或者多个@Bean注解的方法. @Bean:产生一个Bean对象,然后将Bean
-
springboot使用CommandLineRunner解决项目启动时初始化资源的操作
前言: 在我们实际工作中,总会遇到这样需求,在项目启动的时候需要做一些初始化的操作,比如初始化线程池,提前加载好加密证书等. 今天就给大家介绍一个 Spring Boot 神器,专门帮助大家解决项目启动初始化资源操作. 这个神器就是 CommandLineRunner,CommandLineRunner 接口的 Component 会在所有 Spring Beans 都初始化之后,SpringApplication.run() 之前执行,非常适合在应用程序启动之初进行一些数据初始化的工作. 正文
-
springboot中项目启动时实现初始化方法加载参数
目录 springboot项目启动,初始化方法加载参数 1.@PostConstruct说明 2.@PreDestroy说明 第一种:注解@PostConstruct 第二种:实现CommandLineRunner接口 第三种:springboot的启动类 springboot初始化参数顺序 spring初始化参数顺序为 springboot项目启动,初始化方法加载参数 今天我看到项目中用到了 @PostConstruct 这个注解,之前没看到过,特地查了一下, 1.@PostConstruct
-
详解如何在 Linux 启动时自动执行命令或脚本
我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时,也是这样. 更有意思的是,在系统启动以及用户登录或注销时,还可以让系统执行特定的操作. 本文,我们将探讨一下在 Linux 操作系统中实现这些目标的传统方法. 注意:我们假定使用的是 Bash 作为登录及注销的主 Shell.如果你使用的是其他 Shell,那么有些方法可能会无效.如果有其他的疑问
-
如何让docker中的mysql启动时自动执行sql语句
在用docker创建mysql容器的时,有时候我们期望容器启动后数据库和表已经自动建好,初始化数据也已自动录入,也就是说容器启动后我们就能直接连上容器中的数据库,使用其中的数据了. 其实mysql的官方镜像是支持这个能力的,在容器启动的时候自动执行指定的sql脚本或者shell脚本,我们一起来看看mysql官方镜像的Dockerfile,如下图: 已经设定了ENTRYPOINT,里面会调用/entrypoint.sh这个脚本,我们把mysql:8这个镜像pull到本地,再用docker run启
-
记一次springboot配置redis项目启动时的一个奇怪的错误
目录 springboot配置redis项目启动时的错误 总是爆出下面的错误 解决springboot项目启动时redis报错 出现ERRClientsentAUTH,butnopasswordisset的问题 springboot配置redis项目启动时的错误 在刚开始学redis时,我照着网上的教程,把redis和jedis整合到spring boot,整合完毕后,启动项目总是失败 总是爆出下面的错误 Correct the classpath of your application so
-
SpringBoot启动时自动执行sql脚本的方法步骤
需要配置项目下的yml文件: 在文件下加如如下配置: data: classpath:code-generator-data.sql initialization-mode: always spring.datasource.initialization-mode: 初始化模式(springboot2.0),其中有三个值: always为始终执行初始化 embedded只初始化内存数据库(默认值),如h2等 never为不执行初始化 spring.datasource.data: 数据初始化,默
随机推荐
- 导入extjs、jquery 文件时$使用冲突问题解决方法
- Web跨浏览器进程通信(Web跨域)
- CSS中position属性之fixed实现div居中
- smarty表格换行实例
- php数据入库前清理 注意php intval与mysql的int取值范围不同
- 3种php生成唯一id的方法
- Yii控制器中filter过滤器用法分析
- javascript实现的动态添加表单元素input,button等(appendChild)
- 右键-打开方式-选择程序,拒绝访问,怎么办?
- 使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
- 解读PHP中的垃圾回收机制
- js 实用的无间断滚动图效果(良好兼容性)
- C语言实现返回字符串函数的四种方法
- jQuery修改CSS伪元素属性的方法
- javascript 学习笔记(四) 倒计时程序代码
- VC中删除类的两种操作方法
- IOS实现碎片化动画详解
- Android编程实现获取新浪天气预报数据的方法
- 神经网络API、Kotlin支持,那些你必须知道的Android 8.1预览版和Android Studio 3.0新特性
- Vue 中文本内容超出规定行数后展开收起的处理的实现方法