[英]@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创建工作流程是:
@Autowired
字段@Autowired
二传手postProcessBeforeInitialization()
,即CommonAnnotationBeanPostProcessor
调用的@PostConstruct
InitializingBean.afterPropertiesSet()
postProcessAfterInitialization()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.