Consistently sort BeanDefinitionRegistryPostProcessors

Issue: SPR-16043
This commit is contained in:
Juergen Hoeller
2017-10-09 13:59:09 +02:00
parent 53091c76bf
commit ad4c8e7c0d
2 changed files with 77 additions and 35 deletions

View File

@@ -1,5 +1,5 @@
/*
* Copyright 2002-2016 the original author or authors.
* Copyright 2002-2017 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -31,6 +31,7 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.Ordered;
import org.springframework.core.PriorityOrdered;
import org.springframework.tests.sample.beans.TestBean;
import org.springframework.util.Assert;
@@ -101,26 +102,40 @@ public class BeanFactoryPostProcessorTests {
}
@Test
public void testBeanDefinitionRegistryPostProcessor() throws Exception {
public void testBeanDefinitionRegistryPostProcessor() {
StaticApplicationContext ac = new StaticApplicationContext();
ac.registerSingleton("tb1", TestBean.class);
ac.registerSingleton("tb2", TestBean.class);
ac.addBeanFactoryPostProcessor(new PrioritizedBeanDefinitionRegistryPostProcessor());
TestBeanDefinitionRegistryPostProcessor bdrpp = new TestBeanDefinitionRegistryPostProcessor();
ac.addBeanFactoryPostProcessor(bdrpp);
assertFalse(bdrpp.wasCalled);
ac.refresh();
assertTrue(bdrpp.wasCalled);
assertTrue(ac.getBean(TestBeanFactoryPostProcessor.class).wasCalled);
assertTrue(ac.getBean("bfpp1", TestBeanFactoryPostProcessor.class).wasCalled);
assertTrue(ac.getBean("bfpp2", TestBeanFactoryPostProcessor.class).wasCalled);
}
@Test
public void testBeanDefinitionRegistryPostProcessorRegisteringAnother() throws Exception {
public void testBeanDefinitionRegistryPostProcessorRegisteringAnother() {
StaticApplicationContext ac = new StaticApplicationContext();
ac.registerSingleton("tb1", TestBean.class);
ac.registerSingleton("tb2", TestBean.class);
ac.registerBeanDefinition("bdrpp2", new RootBeanDefinition(TestBeanDefinitionRegistryPostProcessor2.class));
ac.registerBeanDefinition("bdrpp2", new RootBeanDefinition(OuterBeanDefinitionRegistryPostProcessor.class));
ac.refresh();
assertTrue(ac.getBean(TestBeanFactoryPostProcessor.class).wasCalled);
assertTrue(ac.getBean("bfpp1", TestBeanFactoryPostProcessor.class).wasCalled);
assertTrue(ac.getBean("bfpp2", TestBeanFactoryPostProcessor.class).wasCalled);
}
@Test
public void testPrioritizedBeanDefinitionRegistryPostProcessorRegisteringAnother() {
StaticApplicationContext ac = new StaticApplicationContext();
ac.registerSingleton("tb1", TestBean.class);
ac.registerSingleton("tb2", TestBean.class);
ac.registerBeanDefinition("bdrpp2", new RootBeanDefinition(PrioritizedOuterBeanDefinitionRegistryPostProcessor.class));
ac.refresh();
assertTrue(ac.getBean("bfpp1", TestBeanFactoryPostProcessor.class).wasCalled);
assertTrue(ac.getBean("bfpp2", TestBeanFactoryPostProcessor.class).wasCalled);
}
@Test
@@ -159,13 +174,32 @@ public class BeanFactoryPostProcessorTests {
}
public static class PrioritizedBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor, Ordered {
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
registry.registerBeanDefinition("bfpp1", new RootBeanDefinition(TestBeanFactoryPostProcessor.class));
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
public static class TestBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
public boolean wasCalled;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
registry.registerBeanDefinition("bfpp", new RootBeanDefinition(TestBeanFactoryPostProcessor.class));
assertTrue(registry.containsBeanDefinition("bfpp1"));
registry.registerBeanDefinition("bfpp2", new RootBeanDefinition(TestBeanFactoryPostProcessor.class));
}
@Override
@@ -175,16 +209,22 @@ public class BeanFactoryPostProcessorTests {
}
public static class TestBeanDefinitionRegistryPostProcessor2 implements BeanDefinitionRegistryPostProcessor, PriorityOrdered {
public static class OuterBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
registry.registerBeanDefinition("anotherpp", new RootBeanDefinition(TestBeanDefinitionRegistryPostProcessor.class));
registry.registerBeanDefinition("ppp", new RootBeanDefinition(PrioritizedBeanDefinitionRegistryPostProcessor.class));
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
public static class PrioritizedOuterBeanDefinitionRegistryPostProcessor extends OuterBeanDefinitionRegistryPostProcessor
implements PriorityOrdered {
@Override
public int getOrder() {