@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
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Eclipse中@SpringBootTest注解报红的解决方案
这篇文章主要介绍了Eclipse中@SpringBootTest注解报红的解决方案,文中给出了原因分析和解决方案,并通过图文结合的方式介绍的非常详细,需要的朋友可以参考下2024-03-03Maven工程搭建spring boot+spring mvc+JPA的示例
本篇文章主要介绍了Maven工程搭建spring boot+spring mvc+JPA的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-01-01详解关于mybatis-plus中Service和Mapper的分析
这篇文章主要介绍了详解关于mybatis-plus中Service和Mapper的分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-09-09java web response提供文件下载功能的实例讲解
下面小编就为大家分享一篇java web response提供文件下载功能的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧2018-01-01基于Spring AOP proxyTargetClass的行为表现总结
这篇文章主要介绍了Spring AOP proxyTargetClass的行为表现总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-08-08Mybatis中SqlSession下的四大对象之执行器(executor)
mybatis中sqlsession下的四大对象是指:executor, statementHandler,parameterHandler,resultHandler对象。这篇文章主要介绍了Mybatis中SqlSession下的四大对象之执行器(executor),需要的朋友可以参考下2019-04-04
最新评论