繁体   English   中英

@PostConstruct 注释和 spring 生命周期

[英]@PostConstruct annotation and spring lifecycle

我是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");
    }
}

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

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

@PostConstruct@Resource@PreDestroy等注解的处理是通过BeanPostProcessor完成的,在本例中是CommonAnnotationBeanPostProcessor 您可以在 Spring 的下图中看到,这些 BPP依赖注入之后但Bean Ready For Use之前处理(这意味着与可注入一样多)。

在此处输入图片说明

是的。 Bean创建工作流程是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM