From 61a3d04e9146c94db28d9b974d7d07c6b645894f Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Mon, 16 Dec 2013 21:47:35 +0100 Subject: [PATCH] Set scoped proxy role to same role as target definition This allows scoped proxy definitions to override regular application bean definitions (again). Issue: SPR-11229 --- .../aop/scope/ScopedProxyUtils.java | 2 +- .../ConfigurationClassPostProcessorTests.java | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/spring-aop/src/main/java/org/springframework/aop/scope/ScopedProxyUtils.java b/spring-aop/src/main/java/org/springframework/aop/scope/ScopedProxyUtils.java index 2f2a89887c..45a743df4a 100644 --- a/spring-aop/src/main/java/org/springframework/aop/scope/ScopedProxyUtils.java +++ b/spring-aop/src/main/java/org/springframework/aop/scope/ScopedProxyUtils.java @@ -58,7 +58,7 @@ public abstract class ScopedProxyUtils { proxyDefinition.setDecoratedDefinition(new BeanDefinitionHolder(targetDefinition, targetBeanName)); proxyDefinition.setOriginatingBeanDefinition(targetDefinition); proxyDefinition.setSource(definition.getSource()); - proxyDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE); + proxyDefinition.setRole(targetDefinition.getRole()); proxyDefinition.getPropertyValues().add("targetBeanName", targetBeanName); if (proxyTargetClass) { diff --git a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java index 19d87946fe..c5025c55f0 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java @@ -19,11 +19,13 @@ package org.springframework.context.annotation; import org.junit.Before; import org.junit.Test; +import org.springframework.aop.scope.ScopedProxyUtils; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver; +import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.support.ChildBeanDefinition; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.beans.factory.support.RootBeanDefinition; @@ -124,6 +126,19 @@ public class ConfigurationClassPostProcessorTests { beanFactory.getBean("bar", TestBean.class); } + @Test + public void testPostProcessorDoesNotOverrideRegularBeanDefinitionsEvenWithScopedProxy() { + RootBeanDefinition rbd = new RootBeanDefinition(TestBean.class); + rbd.setResource(new DescriptiveResource("XML or something")); + BeanDefinitionHolder proxied = ScopedProxyUtils.createScopedProxy(new BeanDefinitionHolder(rbd, "bar"), beanFactory, true); + beanFactory.registerBeanDefinition("bar", proxied.getBeanDefinition()); + beanFactory.registerBeanDefinition("config", new RootBeanDefinition(SingletonBeanConfig.class)); + ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor(); + pp.postProcessBeanFactory(beanFactory); + beanFactory.getBean("foo", Foo.class); + beanFactory.getBean("bar", TestBean.class); + } + @Test public void testProcessingAllowedOnlyOncePerProcessorRegistryPair() { DefaultListableBeanFactory bf1 = new DefaultListableBeanFactory();