-
Notifications
You must be signed in to change notification settings - Fork 38.8k
Description
Affects: 5.3.x, 6.0.x, 6.1.x, 6.2.x
When setting ApplicationStartup on AnnotationConfigWebApplicationContext (or to be precise any AbstractApplicationContext that isn't also GenericApplicationContext) it's not getting propagated to BeanFactory after it was created:
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
FlightRecorderApplicationStartup applicationStartup = new FlightRecorderApplicationStartup();
context.setApplicationStartup(applicationStartup);
context.refresh();
System.out.println(context.getBeanFactory().getApplicationStartup() == applicationStartup); // falseand as a result no bean events are recorded.
It's also not possible to set applicationStartup on the bean factory because it's not created yet, so that results in
BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
As a workaround we can extend the AnnotationConfigWebApplicationContext and either override createBeanFactory
@Override
protected DefaultListableBeanFactory createBeanFactory() {
DefaultListableBeanFactory beanFactory = super.createBeanFactory();
beanFactory.setApplicationStartup(getApplicationStartup());
return beanFactory;
}or override customizeBeanFactory that already propagates other context settings to the BeanFactory
@Override
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
super.customizeBeanFactory(beanFactory);
beanFactory.setApplicationStartup(getApplicationStartup());
}I think that should be done by default from the framework.
P.S. it doesn't reproduce with spring-boot because it uses different (similar?) context - AnnotationConfigServletWebApplicationContext