zoukankan      html  css  js  c++  java
  • 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();
    }
    }

    正确示例

  • 相关阅读:
    echarts 使用demo
    frame外弹出,刷新父页面
    table第一行合并,其余行宽度失效问题
    Redis Desktop Manager
    java web中resources路径
    httpclient
    微信公众号开发: 微信接入(一)
    boot 定时器
    maven自定义archetype
    iOS单例宏
  • 原文地址:https://www.cnblogs.com/acSzz/p/13784937.html
Copyright © 2011-2022 走看看