From 89755542da0fa70284ecf167eef82bcd191b40b9 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 24 Mar 2010 10:34:21 +0000 Subject: [PATCH] BeanPostProcessors are allowed to return a null bean value in the middle of the chain (SPR-6926) --- .../AbstractAutowireCapableBeanFactory.java | 11 +++++++- ...notationConfigApplicationContextTests.java | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java index fdffcdbf2b..cbd3e96bca 100644 --- a/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java +++ b/org.springframework.beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java @@ -392,6 +392,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { result = beanProcessor.postProcessBeforeInitialization(result, beanName); + if (result == null) { + return result; + } } return result; } @@ -402,6 +405,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac Object result = existingBean; for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { result = beanProcessor.postProcessAfterInitialization(result, beanName); + if (result == null) { + return result; + } } return result; } @@ -682,11 +688,14 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac */ protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) { Object exposedObject = bean; - if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { + if (bean != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof SmartInstantiationAwareBeanPostProcessor) { SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp; exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName); + if (exposedObject == null) { + return exposedObject; + } } } } diff --git a/org.springframework.context/src/test/java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java b/org.springframework.context/src/test/java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java index 7f38354d02..c27c30f421 100644 --- a/org.springframework.context/src/test/java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java +++ b/org.springframework.context/src/test/java/org/springframework/context/annotation/AnnotationConfigApplicationContextTests.java @@ -27,6 +27,7 @@ import static org.junit.matchers.JUnitMatchers.*; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.annotation6.ComponentForScanning; import org.springframework.context.annotation6.ConfigForScanning; import org.springframework.context.annotation6.Jsr330NamedForScanning; @@ -154,6 +155,31 @@ public class AnnotationConfigApplicationContextTests { assertThat(context.getBean(TestBean.class).name, equalTo("foo")); } + @Test + public void nullReturningBeanPostProcessor() { + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + context.register(AutowiredConfig.class); + context.getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() { + public Object postProcessBeforeInitialization(Object bean, String beanName) { + return (bean instanceof TestBean ? null : bean); + } + public Object postProcessAfterInitialization(Object bean, String beanName) { + return bean; + } + }); + context.getBeanFactory().addBeanPostProcessor(new BeanPostProcessor() { + public Object postProcessBeforeInitialization(Object bean, String beanName) { + bean.getClass().getName(); + return bean; + } + public Object postProcessAfterInitialization(Object bean, String beanName) { + bean.getClass().getName(); + return bean; + } + }); + context.refresh(); + } + @Configuration static class Config {