好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

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

原因

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

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

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

@PostConstruct执行顺序

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

写了段代码验证一下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

@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

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

原文链接:https://blog.csdn.net/yinyan1314/article/details/80362584

查看更多关于@PostConstruct在项目启动时被执行两次或多次的原因及分析的详细内容...

  阅读:94次