@PostConstruct注释和弹簧生命周期

2022-09-01 02:54:53

我是春天的新手,我想知道:

我有一个用(spring)注释的java类,里面有一个用.然后,该类由另一个类中的带注释字段引用。我可以假设类只是在被调用后才注入的吗?@Component@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");
    }
}

答案 1

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

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


答案 2

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

enter image description here


推荐