• spring bean初始化顺序


    转自http://markey.cc/2018/11/04/SpringBoot%E4%B8%AD%E7%9A%84Bean%E5%88%9D%E5%A7%8B%E5%8C%96%E6%96%B9%E6%B3%95%E2%80%94%E2%80%94-PostConstruct/

     

    注解说明

    • 使用注解: @PostConstruct
    • 效果:在Bean初始化之后(构造方法和@Autowired之后)执行指定操作。经常用在将构造方法中的动作延迟。
    • 备注:Bean初始化时候的执行顺序: 构造方法 -> @Autowired -> @PostConstruct

    引入步骤

    在自定义的bean初始化方法上加上@PostConstruct

    示例代码

    完整参考代码github

    注解示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    import org.springframework.stereotype.Component;
    import javax.annotation.PostConstruct;

    @Component
    public class MyPostConstruct {

    @PostConstruct
    public void init() {
    System.out.println("this is init method");
    }
    }

    运行结果:
    运行结果

    常见问题

    在Bean的初始化操作中,有时候会遇到调用其他Bean的时候报空指针错误。这时候就可以将调用另一个Bean的方法这个操作放到@PostConstruct注解的方法中,将其延迟执行。

    例如:我们想要在MyPostConstruct方法初始化时调用YourPostConstruct的方法,于是就在MyPostConstruct的构造方法中加入了初始化操作,此时Spring启动会报错。
    原因:MyPostConstruct调用YourPostConstruct的方法时,YourPostConstruct这个Bean还没有初始化完成。
    解决方案:将初始化操作放到@PostConstruct注解的方法中,这样就能保证在调用方法时Bean已经初始化完成。

    错误示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;

    @Component
    public class MyPostConstruct {

    @Autowired
    YourPostConstruct yourPostConstruct;

    public MyPostConstruct() {
    yourPostConstruct.sayHello();
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import org.springframework.stereotype.Component;

    @Component
    public class YourPostConstruct {

    public void sayHello() {
    System.out.println("hello, i am yourPostConstruct");
    }
    }

    错误示例

    正确示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import javax.annotation.PostConstruct;

    @Component
    public class MyPostConstruct {

    @Autowired
    YourPostConstruct yourPostConstruct;

    @PostConstruct
    public void init() {
    yourPostConstruct.sayHello();
    }

    public MyPostConstruct() {
    // yourPostConstruct.sayHello();
    }
    }

    正确示例

  • 相关阅读:
    springmvc介绍
    mybatis中的动态sql应用
    mybatis中表的关联
    mybatis分页
    聚类评估指标系列(二):准确率和F值
    混淆矩阵,准确率,召回率,F-score,PR曲线,ROC曲线,AUC
    聚类评估指标系列(一):标准化互信息NMI计算步骤及其Python实现
    numpy.where() 用法详解
    互信息Mutual Information
    转:Prewitt算子、Sobel算子、canny算子、Lapacian算子
  • 原文地址:https://www.cnblogs.com/acSzz/p/13784937.html
Copyright © 2020-2023  润新知