@PostConstruct 注解和 spring 生命周期

@PostConstruct annotation and spring lifecycle

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

我有一个用 @Component (spring) 注释的 java class 并且在里面我有一个用 @PostConstruct 注释的方法。 class 然后被另一个 class 中的 @Autowired 注释字段引用。我可以假设 class 仅在调用 @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");
    }
}

如果你问的是给定 class 的注入发生在调用该 bean 的 @PostConstruct 之后,那么答案是肯定的 - @PostConstruct 在 bean 被视为 "injectable"

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

诸如@PostConstruct@Resource@PreDestroy等注释的处理是通过BeanPostProcessor完成的,在本例中是CommonAnnotationBeanPostProcessor。您可以在下图中从 Spring 中看到,这些 BPP 在 after 依赖注入但是 before Bean Ready For Use (哪个意味着与注射一样多)。

是的。 Bean 创建工作流是:

  1. 构造调用
  2. @Autowired 字段
  3. @Autowired 二传手
  4. BeanPostProcessor 的 postProcessBeforeInitialization(),即 @PostConstructCommonAnnotationBeanPostProcessor
  5. 调用
  6. InitializingBean.afterPropertiesSet()
  7. BeanPostProcessor 的 postProcessAfterInitialization()
  8. Bean 已准备就绪,可以注入其他 Bean