Browse Source

Polishing

pull/28937/head
Sam Brannen 4 years ago
parent
commit
853407b6f8
  1. 9
      spring-context/src/main/java/org/springframework/context/aot/ApplicationContextAotGenerator.java
  2. 9
      spring-context/src/main/java/org/springframework/context/aot/ApplicationContextInitializationCodeGenerator.java
  3. 89
      spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java

9
spring-context/src/main/java/org/springframework/context/aot/ApplicationContextAotGenerator.java

@ -36,13 +36,14 @@ import org.springframework.javapoet.ClassName;
public class ApplicationContextAotGenerator { public class ApplicationContextAotGenerator {
/** /**
* Process the specified {@link GenericApplicationContext} instance * Process the specified {@link GenericApplicationContext} ahead-of-time using
* ahead-of-time using the specified {@link GenerationContext}. * the specified {@link GenerationContext}.
* <p>Return the {@link ClassName} of the {@link ApplicationContextInitializer} * <p>Return the {@link ClassName} of the {@link ApplicationContextInitializer}
* to use to restore an optimized state of the application context. * to use to restore an optimized state of the application context.
* @param applicationContext the non-refreshed application context to handle * @param applicationContext the non-refreshed application context to process
* @param generationContext the generation context to use * @param generationContext the generation context to use
* @return the class name of the {@link ApplicationContextInitializer} entry point * @return the {@code ClassName} of the {@code ApplicationContextInitializer}
* entry point
*/ */
public ClassName processAheadOfTime(GenericApplicationContext applicationContext, public ClassName processAheadOfTime(GenericApplicationContext applicationContext,
GenerationContext generationContext) { GenerationContext generationContext) {

9
spring-context/src/main/java/org/springframework/context/aot/ApplicationContextInitializationCodeGenerator.java

@ -36,13 +36,12 @@ import org.springframework.javapoet.ParameterizedTypeName;
import org.springframework.javapoet.TypeSpec; import org.springframework.javapoet.TypeSpec;
/** /**
* Internal code generator to create the application context initializer. * Internal code generator to create the {@link ApplicationContextInitializer}.
* *
* @author Phillip Webb * @author Phillip Webb
* @since 6.0 * @since 6.0
*/ */
class ApplicationContextInitializationCodeGenerator class ApplicationContextInitializationCodeGenerator implements BeanFactoryInitializationCode {
implements BeanFactoryInitializationCode {
private static final String INITIALIZE_METHOD = "initialize"; private static final String INITIALIZE_METHOD = "initialize";
@ -70,13 +69,11 @@ class ApplicationContextInitializationCodeGenerator
type.addMethod(generateInitializeMethod()); type.addMethod(generateInitializeMethod());
} }
private MethodSpec generateInitializeMethod() { private MethodSpec generateInitializeMethod() {
MethodSpec.Builder method = MethodSpec.methodBuilder(INITIALIZE_METHOD); MethodSpec.Builder method = MethodSpec.methodBuilder(INITIALIZE_METHOD);
method.addAnnotation(Override.class); method.addAnnotation(Override.class);
method.addModifiers(Modifier.PUBLIC); method.addModifiers(Modifier.PUBLIC);
method.addParameter(GenericApplicationContext.class, method.addParameter(GenericApplicationContext.class, APPLICATION_CONTEXT_VARIABLE);
APPLICATION_CONTEXT_VARIABLE);
method.addCode(generateInitializeCode()); method.addCode(generateInitializeCode());
return method.build(); return method.build();
} }

89
spring-context/src/test/java/org/springframework/context/aot/ApplicationContextAotGeneratorTests.java

@ -57,40 +57,31 @@ class ApplicationContextAotGeneratorTests {
@Test @Test
void generateApplicationContextWhenHasSimpleBean() { void generateApplicationContextWhenHasSimpleBean() {
GenericApplicationContext applicationContext = new GenericApplicationContext(); GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.registerBeanDefinition("test", applicationContext.registerBeanDefinition("test", new RootBeanDefinition(SimpleComponent.class));
new RootBeanDefinition(SimpleComponent.class));
testCompiledResult(applicationContext, (initializer, compiled) -> { testCompiledResult(applicationContext, (initializer, compiled) -> {
GenericApplicationContext freshApplicationContext = toFreshApplicationContext( GenericApplicationContext freshApplicationContext = toFreshApplicationContext(initializer);
initializer); assertThat(freshApplicationContext.getBeanDefinitionNames()).containsOnly("test");
assertThat(freshApplicationContext.getBeanDefinitionNames()) assertThat(freshApplicationContext.getBean("test")).isInstanceOf(SimpleComponent.class);
.containsOnly("test");
assertThat(freshApplicationContext.getBean("test"))
.isInstanceOf(SimpleComponent.class);
}); });
} }
@Test @Test
void generateApplicationContextWhenHasAutowiring() { void generateApplicationContextWhenHasAutowiring() {
GenericApplicationContext applicationContext = new GenericApplicationContext(); GenericApplicationContext applicationContext = new GenericApplicationContext();
applicationContext.registerBeanDefinition( applicationContext.registerBeanDefinition(AnnotationConfigUtils.AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME,
AnnotationConfigUtils.AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME,
BeanDefinitionBuilder BeanDefinitionBuilder
.rootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class) .rootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class)
.setRole(BeanDefinition.ROLE_INFRASTRUCTURE).getBeanDefinition()); .setRole(BeanDefinition.ROLE_INFRASTRUCTURE).getBeanDefinition());
applicationContext.registerBeanDefinition("autowiredComponent", applicationContext.registerBeanDefinition("autowiredComponent", new RootBeanDefinition(AutowiredComponent.class));
new RootBeanDefinition(AutowiredComponent.class));
applicationContext.registerBeanDefinition("number", applicationContext.registerBeanDefinition("number",
BeanDefinitionBuilder.rootBeanDefinition(Integer.class, "valueOf") BeanDefinitionBuilder
.addConstructorArgValue("42").getBeanDefinition()); .rootBeanDefinition(Integer.class, "valueOf")
.addConstructorArgValue("42").getBeanDefinition());
testCompiledResult(applicationContext, (initializer, compiled) -> { testCompiledResult(applicationContext, (initializer, compiled) -> {
GenericApplicationContext freshApplicationContext = toFreshApplicationContext( GenericApplicationContext freshApplicationContext = toFreshApplicationContext(initializer);
initializer); assertThat(freshApplicationContext.getBeanDefinitionNames()).containsOnly("autowiredComponent", "number");
assertThat(freshApplicationContext.getBeanDefinitionNames()) AutowiredComponent bean = freshApplicationContext.getBean(AutowiredComponent.class);
.containsOnly("autowiredComponent", "number"); assertThat(bean.getEnvironment()).isSameAs(freshApplicationContext.getEnvironment());
AutowiredComponent bean = freshApplicationContext
.getBean(AutowiredComponent.class);
assertThat(bean.getEnvironment())
.isSameAs(freshApplicationContext.getEnvironment());
assertThat(bean.getCounter()).isEqualTo(42); assertThat(bean.getCounter()).isEqualTo(42);
}); });
} }
@ -101,17 +92,14 @@ class ApplicationContextAotGeneratorTests {
applicationContext.registerBeanDefinition( applicationContext.registerBeanDefinition(
AnnotationConfigUtils.COMMON_ANNOTATION_PROCESSOR_BEAN_NAME, AnnotationConfigUtils.COMMON_ANNOTATION_PROCESSOR_BEAN_NAME,
BeanDefinitionBuilder BeanDefinitionBuilder
.rootBeanDefinition(CommonAnnotationBeanPostProcessor.class) .rootBeanDefinition(CommonAnnotationBeanPostProcessor.class)
.setRole(BeanDefinition.ROLE_INFRASTRUCTURE).getBeanDefinition()); .setRole(BeanDefinition.ROLE_INFRASTRUCTURE).getBeanDefinition());
applicationContext.registerBeanDefinition("initDestroyComponent", applicationContext.registerBeanDefinition("initDestroyComponent",
new RootBeanDefinition(InitDestroyComponent.class)); new RootBeanDefinition(InitDestroyComponent.class));
testCompiledResult(applicationContext, (initializer, compiled) -> { testCompiledResult(applicationContext, (initializer, compiled) -> {
GenericApplicationContext freshApplicationContext = toFreshApplicationContext( GenericApplicationContext freshApplicationContext = toFreshApplicationContext(initializer);
initializer); assertThat(freshApplicationContext.getBeanDefinitionNames()).containsOnly("initDestroyComponent");
assertThat(freshApplicationContext.getBeanDefinitionNames()) InitDestroyComponent bean = freshApplicationContext.getBean(InitDestroyComponent.class);
.containsOnly("initDestroyComponent");
InitDestroyComponent bean = freshApplicationContext
.getBean(InitDestroyComponent.class);
assertThat(bean.events).containsExactly("init"); assertThat(bean.events).containsExactly("init");
freshApplicationContext.close(); freshApplicationContext.close();
assertThat(bean.events).containsExactly("init", "destroy"); assertThat(bean.events).containsExactly("init", "destroy");
@ -124,24 +112,19 @@ class ApplicationContextAotGeneratorTests {
applicationContext.registerBeanDefinition( applicationContext.registerBeanDefinition(
AnnotationConfigUtils.COMMON_ANNOTATION_PROCESSOR_BEAN_NAME, AnnotationConfigUtils.COMMON_ANNOTATION_PROCESSOR_BEAN_NAME,
BeanDefinitionBuilder BeanDefinitionBuilder
.rootBeanDefinition(CommonAnnotationBeanPostProcessor.class) .rootBeanDefinition(CommonAnnotationBeanPostProcessor.class)
.setRole(BeanDefinition.ROLE_INFRASTRUCTURE).getBeanDefinition()); .setRole(BeanDefinition.ROLE_INFRASTRUCTURE).getBeanDefinition());
RootBeanDefinition beanDefinition = new RootBeanDefinition( RootBeanDefinition beanDefinition = new RootBeanDefinition(InitDestroyComponent.class);
InitDestroyComponent.class);
beanDefinition.setInitMethodName("customInit"); beanDefinition.setInitMethodName("customInit");
beanDefinition.setDestroyMethodName("customDestroy"); beanDefinition.setDestroyMethodName("customDestroy");
applicationContext.registerBeanDefinition("initDestroyComponent", beanDefinition); applicationContext.registerBeanDefinition("initDestroyComponent", beanDefinition);
testCompiledResult(applicationContext, (initializer, compiled) -> { testCompiledResult(applicationContext, (initializer, compiled) -> {
GenericApplicationContext freshApplicationContext = toFreshApplicationContext( GenericApplicationContext freshApplicationContext = toFreshApplicationContext(initializer);
initializer); assertThat(freshApplicationContext.getBeanDefinitionNames()).containsOnly("initDestroyComponent");
assertThat(freshApplicationContext.getBeanDefinitionNames()) InitDestroyComponent bean = freshApplicationContext.getBean(InitDestroyComponent.class);
.containsOnly("initDestroyComponent");
InitDestroyComponent bean = freshApplicationContext
.getBean(InitDestroyComponent.class);
assertThat(bean.events).containsExactly("customInit", "init"); assertThat(bean.events).containsExactly("customInit", "init");
freshApplicationContext.close(); freshApplicationContext.close();
assertThat(bean.events).containsExactly("customInit", "init", "customDestroy", assertThat(bean.events).containsExactly("customInit", "init", "customDestroy", "destroy");
"destroy");
}); });
} }
@ -149,8 +132,7 @@ class ApplicationContextAotGeneratorTests {
void generateApplicationContextWhenHasNoAotContributions() { void generateApplicationContextWhenHasNoAotContributions() {
GenericApplicationContext applicationContext = new GenericApplicationContext(); GenericApplicationContext applicationContext = new GenericApplicationContext();
testCompiledResult(applicationContext, (initializer, compiled) -> { testCompiledResult(applicationContext, (initializer, compiled) -> {
GenericApplicationContext freshApplicationContext = toFreshApplicationContext( GenericApplicationContext freshApplicationContext = toFreshApplicationContext(initializer);
initializer);
assertThat(freshApplicationContext.getBeanDefinitionNames()).isEmpty(); assertThat(freshApplicationContext.getBeanDefinitionNames()).isEmpty();
assertThat(compiled.getSourceFile()).contains( assertThat(compiled.getSourceFile()).contains(
"beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver())"); "beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver())");
@ -163,8 +145,7 @@ class ApplicationContextAotGeneratorTests {
applicationContext.registerBeanDefinition("test", applicationContext.registerBeanDefinition("test",
new RootBeanDefinition(NoOpBeanFactoryInitializationAotProcessor.class)); new RootBeanDefinition(NoOpBeanFactoryInitializationAotProcessor.class));
testCompiledResult(applicationContext, (initializer, compiled) -> { testCompiledResult(applicationContext, (initializer, compiled) -> {
GenericApplicationContext freshApplicationContext = toFreshApplicationContext( GenericApplicationContext freshApplicationContext = toFreshApplicationContext(initializer);
initializer);
assertThat(freshApplicationContext.getBeanDefinitionNames()).isEmpty(); assertThat(freshApplicationContext.getBeanDefinitionNames()).isEmpty();
}); });
} }
@ -175,8 +156,7 @@ class ApplicationContextAotGeneratorTests {
applicationContext.registerBeanDefinition("test", applicationContext.registerBeanDefinition("test",
new RootBeanDefinition(NoOpBeanRegistrationAotProcessor.class)); new RootBeanDefinition(NoOpBeanRegistrationAotProcessor.class));
testCompiledResult(applicationContext, (initializer, compiled) -> { testCompiledResult(applicationContext, (initializer, compiled) -> {
GenericApplicationContext freshApplicationContext = toFreshApplicationContext( GenericApplicationContext freshApplicationContext = toFreshApplicationContext(initializer);
initializer);
assertThat(freshApplicationContext.getBeanDefinitionNames()).isEmpty(); assertThat(freshApplicationContext.getBeanDefinitionNames()).isEmpty();
}); });
} }
@ -205,13 +185,11 @@ class ApplicationContextAotGeneratorTests {
implements BeanFactoryPostProcessor, BeanFactoryInitializationAotProcessor { implements BeanFactoryPostProcessor, BeanFactoryInitializationAotProcessor {
@Override @Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
throws BeansException {
} }
@Override @Override
public BeanFactoryInitializationAotContribution processAheadOfTime( public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {
ConfigurableListableBeanFactory beanFactory) {
return null; return null;
} }
@ -222,8 +200,7 @@ class ApplicationContextAotGeneratorTests {
implements BeanPostProcessor, BeanRegistrationAotProcessor { implements BeanPostProcessor, BeanRegistrationAotProcessor {
@Override @Override
public BeanRegistrationAotContribution processAheadOfTime( public BeanRegistrationAotContribution processAheadOfTime(RegisteredBean registeredBean) {
RegisteredBean registeredBean) {
return null; return null;
} }

Loading…
Cancel
Save