BeanPostProcessors are allowed to return a null bean value in the middle of the chain (SPR-6926)
git-svn-id: https://src.springframework.org/svn/spring-framework/trunk@3154 50f2f4bb-b051-0410-bef5-90022cba6387
This commit is contained in:
parent
8825909f04
commit
e62e56a1a4
|
|
@ -392,6 +392,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
||||||
Object result = existingBean;
|
Object result = existingBean;
|
||||||
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
|
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
|
||||||
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
|
result = beanProcessor.postProcessBeforeInitialization(result, beanName);
|
||||||
|
if (result == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -402,6 +405,9 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
||||||
Object result = existingBean;
|
Object result = existingBean;
|
||||||
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
|
for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
|
||||||
result = beanProcessor.postProcessAfterInitialization(result, beanName);
|
result = beanProcessor.postProcessAfterInitialization(result, beanName);
|
||||||
|
if (result == null) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
@ -682,11 +688,14 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
|
||||||
*/
|
*/
|
||||||
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
|
protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
|
||||||
Object exposedObject = bean;
|
Object exposedObject = bean;
|
||||||
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
|
if (bean != null && !mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
|
||||||
for (BeanPostProcessor bp : getBeanPostProcessors()) {
|
for (BeanPostProcessor bp : getBeanPostProcessors()) {
|
||||||
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
|
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
|
||||||
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
|
SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
|
||||||
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
|
exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
|
||||||
|
if (exposedObject == null) {
|
||||||
|
return exposedObject;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ import static org.junit.matchers.JUnitMatchers.*;
|
||||||
import org.springframework.beans.factory.FactoryBean;
|
import org.springframework.beans.factory.FactoryBean;
|
||||||
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
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.ComponentForScanning;
|
||||||
import org.springframework.context.annotation6.ConfigForScanning;
|
import org.springframework.context.annotation6.ConfigForScanning;
|
||||||
import org.springframework.context.annotation6.Jsr330NamedForScanning;
|
import org.springframework.context.annotation6.Jsr330NamedForScanning;
|
||||||
|
|
@ -154,6 +155,31 @@ public class AnnotationConfigApplicationContextTests {
|
||||||
assertThat(context.getBean(TestBean.class).name, equalTo("foo"));
|
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
|
@Configuration
|
||||||
static class Config {
|
static class Config {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue