@PostConstruct在项目启动时被执行两次或多次的原因是什么
本篇内容介绍了“@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
“@PostConstruct在项目启动时被执行两次或多次的原因是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!