@PostConstruct注解和spring生命周期

新手上路,请多包涵

我是 Spring 的新手,我想知道:

我有一个用 @Component (spring) 注释的 java 类,在里面我有一个用 @PostConstruct 注释的方法。然后该类被另一个类中的 @Autowired 注释字段引用。我可以假设该类仅在调用 @PostConstruct 之后注入吗?

 @Component
class AuthenticationMetrics {

    private static final MetricRegistry metrics = new MetricRegistry();

    final Counter requestsTotal;

    final Meter guestLogins;

    final Meter kfUserLogins;

    final Timer guestLoginResponseTime;

    final Timer kfLoginResponseTime;

    @PostConstruct
    public void populateMetricsRegistry() {
        metrics.counter("authentication.requests.totals");
    }
}

原文由 Daniele 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 515
2 个回答

如果你问的是给定类的注入发生在 @PostConstruct 在那个 bean 被调用之后,那么答案是肯定的 - @PostConstruct 在 bean 被认为是“可注入的”之前执行

如果你问是否 @PostConstruct 在所有注入完成后(在同一个bean上)执行给定的bean - 那么是的 - @PostConstruct 在注入给定bean之后执行。这就是它存在的原因。通常,您可以将 @PostConstruct 操作放入构造函数中。但是,当创建新对象(调用构造函数)时,尚未执行注入 - 因此任何依赖于注入对象的初始化都会因 NPE 而失败。这就是为什么你需要 @PostConstruct

原文由 Antoniossss 发布,翻译遵循 CC BY-SA 3.0 许可协议

诸如 @PostConstruct , @Resource , @PreDestroy 之类的注释的处理是通过 BeanAnpostProcessor this PostProcessor 案例完成的。您可以在 Spring 的下图中看到,这些 BPP 在依赖注入 之后 Bean Ready For Use 之前处理(这意味着尽可能多的可注入)。

在此处输入图像描述

原文由 Nico Van Belle 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题