Early configuration of ApplicationStartup on BeanFactory
Prior to this commit, the `GenericApplicationContext` configured the `AppliationStartup` on the `BeanFactory` only right before refreshing it. Delaying this has no purpose and we should instead configure it as soon as possible by overriding the setter method. Closes gh-25718
This commit is contained in:
parent
3fd89c3ac1
commit
c5694506ae
|
@ -36,6 +36,7 @@ import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.core.io.Resource;
|
import org.springframework.core.io.Resource;
|
||||||
import org.springframework.core.io.ResourceLoader;
|
import org.springframework.core.io.ResourceLoader;
|
||||||
import org.springframework.core.io.support.ResourcePatternResolver;
|
import org.springframework.core.io.support.ResourcePatternResolver;
|
||||||
|
import org.springframework.core.metrics.ApplicationStartup;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
|
@ -158,6 +159,12 @@ public class GenericApplicationContext extends AbstractApplicationContext implem
|
||||||
this.beanFactory.setParentBeanFactory(getInternalParentBeanFactory());
|
this.beanFactory.setParentBeanFactory(getInternalParentBeanFactory());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setApplicationStartup(ApplicationStartup applicationStartup) {
|
||||||
|
super.setApplicationStartup(applicationStartup);
|
||||||
|
this.beanFactory.setApplicationStartup(applicationStartup);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set whether it should be allowed to override bean definitions by registering
|
* Set whether it should be allowed to override bean definitions by registering
|
||||||
* a different definition with the same name, automatically replacing the former.
|
* a different definition with the same name, automatically replacing the former.
|
||||||
|
@ -266,7 +273,6 @@ public class GenericApplicationContext extends AbstractApplicationContext implem
|
||||||
throw new IllegalStateException(
|
throw new IllegalStateException(
|
||||||
"GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
|
"GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once");
|
||||||
}
|
}
|
||||||
this.beanFactory.setApplicationStartup(this.getApplicationStartup());
|
|
||||||
this.beanFactory.setSerializationId(getId());
|
this.beanFactory.setSerializationId(getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright 2002-2019 the original author or authors.
|
* Copyright 2002-2020 the original author or authors.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -23,6 +23,7 @@ import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.beans.factory.support.RootBeanDefinition;
|
import org.springframework.beans.factory.support.RootBeanDefinition;
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.context.ApplicationContextAware;
|
import org.springframework.context.ApplicationContextAware;
|
||||||
|
import org.springframework.core.metrics.jfr.FlightRecorderApplicationStartup;
|
||||||
import org.springframework.util.ObjectUtils;
|
import org.springframework.util.ObjectUtils;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
|
@ -36,7 +37,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
|
||||||
public class GenericApplicationContextTests {
|
public class GenericApplicationContextTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getBeanForClass() {
|
void getBeanForClass() {
|
||||||
GenericApplicationContext ac = new GenericApplicationContext();
|
GenericApplicationContext ac = new GenericApplicationContext();
|
||||||
ac.registerBeanDefinition("testBean", new RootBeanDefinition(String.class));
|
ac.registerBeanDefinition("testBean", new RootBeanDefinition(String.class));
|
||||||
ac.refresh();
|
ac.refresh();
|
||||||
|
@ -50,7 +51,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void withSingletonSupplier() {
|
void withSingletonSupplier() {
|
||||||
GenericApplicationContext ac = new GenericApplicationContext();
|
GenericApplicationContext ac = new GenericApplicationContext();
|
||||||
ac.registerBeanDefinition("testBean", new RootBeanDefinition(String.class, ac::toString));
|
ac.registerBeanDefinition("testBean", new RootBeanDefinition(String.class, ac::toString));
|
||||||
ac.refresh();
|
ac.refresh();
|
||||||
|
@ -62,7 +63,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void withScopedSupplier() {
|
void withScopedSupplier() {
|
||||||
GenericApplicationContext ac = new GenericApplicationContext();
|
GenericApplicationContext ac = new GenericApplicationContext();
|
||||||
ac.registerBeanDefinition("testBean",
|
ac.registerBeanDefinition("testBean",
|
||||||
new RootBeanDefinition(String.class, BeanDefinition.SCOPE_PROTOTYPE, ac::toString));
|
new RootBeanDefinition(String.class, BeanDefinition.SCOPE_PROTOTYPE, ac::toString));
|
||||||
|
@ -75,7 +76,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void accessAfterClosing() {
|
void accessAfterClosing() {
|
||||||
GenericApplicationContext ac = new GenericApplicationContext();
|
GenericApplicationContext ac = new GenericApplicationContext();
|
||||||
ac.registerBeanDefinition("testBean", new RootBeanDefinition(String.class));
|
ac.registerBeanDefinition("testBean", new RootBeanDefinition(String.class));
|
||||||
ac.refresh();
|
ac.refresh();
|
||||||
|
@ -95,7 +96,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void individualBeans() {
|
void individualBeans() {
|
||||||
GenericApplicationContext context = new GenericApplicationContext();
|
GenericApplicationContext context = new GenericApplicationContext();
|
||||||
context.registerBean(BeanA.class);
|
context.registerBean(BeanA.class);
|
||||||
context.registerBean(BeanB.class);
|
context.registerBean(BeanB.class);
|
||||||
|
@ -108,7 +109,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void individualNamedBeans() {
|
void individualNamedBeans() {
|
||||||
GenericApplicationContext context = new GenericApplicationContext();
|
GenericApplicationContext context = new GenericApplicationContext();
|
||||||
context.registerBean("a", BeanA.class);
|
context.registerBean("a", BeanA.class);
|
||||||
context.registerBean("b", BeanB.class);
|
context.registerBean("b", BeanB.class);
|
||||||
|
@ -121,7 +122,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void individualBeanWithSupplier() {
|
void individualBeanWithSupplier() {
|
||||||
GenericApplicationContext context = new GenericApplicationContext();
|
GenericApplicationContext context = new GenericApplicationContext();
|
||||||
context.registerBean(BeanA.class,
|
context.registerBean(BeanA.class,
|
||||||
() -> new BeanA(context.getBean(BeanB.class), context.getBean(BeanC.class)));
|
() -> new BeanA(context.getBean(BeanB.class), context.getBean(BeanC.class)));
|
||||||
|
@ -139,7 +140,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void individualBeanWithSupplierAndCustomizer() {
|
void individualBeanWithSupplierAndCustomizer() {
|
||||||
GenericApplicationContext context = new GenericApplicationContext();
|
GenericApplicationContext context = new GenericApplicationContext();
|
||||||
context.registerBean(BeanA.class,
|
context.registerBean(BeanA.class,
|
||||||
() -> new BeanA(context.getBean(BeanB.class), context.getBean(BeanC.class)),
|
() -> new BeanA(context.getBean(BeanB.class), context.getBean(BeanC.class)),
|
||||||
|
@ -155,7 +156,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void individualNamedBeanWithSupplier() {
|
void individualNamedBeanWithSupplier() {
|
||||||
GenericApplicationContext context = new GenericApplicationContext();
|
GenericApplicationContext context = new GenericApplicationContext();
|
||||||
context.registerBean("a", BeanA.class,
|
context.registerBean("a", BeanA.class,
|
||||||
() -> new BeanA(context.getBean(BeanB.class), context.getBean(BeanC.class)));
|
() -> new BeanA(context.getBean(BeanB.class), context.getBean(BeanC.class)));
|
||||||
|
@ -170,7 +171,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void individualNamedBeanWithSupplierAndCustomizer() {
|
void individualNamedBeanWithSupplierAndCustomizer() {
|
||||||
GenericApplicationContext context = new GenericApplicationContext();
|
GenericApplicationContext context = new GenericApplicationContext();
|
||||||
context.registerBean("a", BeanA.class,
|
context.registerBean("a", BeanA.class,
|
||||||
() -> new BeanA(context.getBean(BeanB.class), context.getBean(BeanC.class)),
|
() -> new BeanA(context.getBean(BeanB.class), context.getBean(BeanC.class)),
|
||||||
|
@ -186,7 +187,7 @@ public class GenericApplicationContextTests {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void individualBeanWithNullReturningSupplier() {
|
void individualBeanWithNullReturningSupplier() {
|
||||||
GenericApplicationContext context = new GenericApplicationContext();
|
GenericApplicationContext context = new GenericApplicationContext();
|
||||||
context.registerBean("a", BeanA.class, () -> null);
|
context.registerBean("a", BeanA.class, () -> null);
|
||||||
context.registerBean("b", BeanB.class, BeanB::new);
|
context.registerBean("b", BeanB.class, BeanB::new);
|
||||||
|
@ -201,6 +202,14 @@ public class GenericApplicationContextTests {
|
||||||
assertThat(context.getBeansOfType(BeanC.class).values().iterator().next()).isSameAs(context.getBean(BeanC.class));
|
assertThat(context.getBeansOfType(BeanC.class).values().iterator().next()).isSameAs(context.getBean(BeanC.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void configureApplicationStartupOnBeanFactory() {
|
||||||
|
FlightRecorderApplicationStartup applicationStartup = new FlightRecorderApplicationStartup();
|
||||||
|
GenericApplicationContext context = new GenericApplicationContext();
|
||||||
|
context.setApplicationStartup(applicationStartup);
|
||||||
|
assertThat(context.getBeanFactory().getApplicationStartup()).isEqualTo(applicationStartup);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static class BeanA {
|
static class BeanA {
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue