@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 创建工作流是:
- 构造调用
@Autowired
字段
@Autowired
二传手
- BeanPostProcessor 的
postProcessBeforeInitialization()
,即 @PostConstruct
由 CommonAnnotationBeanPostProcessor
调用
InitializingBean.afterPropertiesSet()
- BeanPostProcessor 的
postProcessAfterInitialization()
- Bean 已准备就绪,可以注入其他 Bean
我是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 创建工作流是:
- 构造调用
@Autowired
字段@Autowired
二传手- BeanPostProcessor 的
postProcessBeforeInitialization()
,即@PostConstruct
由CommonAnnotationBeanPostProcessor
调用
InitializingBean.afterPropertiesSet()
- BeanPostProcessor 的
postProcessAfterInitialization()
- Bean 已准备就绪,可以注入其他 Bean