Skip to content

Commit 61a3d04

Browse files
committed
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
1 parent e2f85fc commit 61a3d04

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

spring-aop/src/main/java/org/springframework/aop/scope/ScopedProxyUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public static BeanDefinitionHolder createScopedProxy(BeanDefinitionHolder defini
5858
proxyDefinition.setDecoratedDefinition(new BeanDefinitionHolder(targetDefinition, targetBeanName));
5959
proxyDefinition.setOriginatingBeanDefinition(targetDefinition);
6060
proxyDefinition.setSource(definition.getSource());
61-
proxyDefinition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
61+
proxyDefinition.setRole(targetDefinition.getRole());
6262

6363
proxyDefinition.getPropertyValues().add("targetBeanName", targetBeanName);
6464
if (proxyTargetClass) {

spring-context/src/test/java/org/springframework/context/annotation/ConfigurationClassPostProcessorTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@
1919
import org.junit.Before;
2020
import org.junit.Test;
2121

22+
import org.springframework.aop.scope.ScopedProxyUtils;
2223
import org.springframework.beans.factory.FactoryBean;
2324
import org.springframework.beans.factory.annotation.Autowired;
2425
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor;
2526
import org.springframework.beans.factory.annotation.Qualifier;
2627
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver;
28+
import org.springframework.beans.factory.config.BeanDefinitionHolder;
2729
import org.springframework.beans.factory.support.ChildBeanDefinition;
2830
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
2931
import org.springframework.beans.factory.support.RootBeanDefinition;
@@ -124,6 +126,19 @@ public void testPostProcessorDoesNotOverrideRegularBeanDefinitions() {
124126
beanFactory.getBean("bar", TestBean.class);
125127
}
126128

129+
@Test
130+
public void testPostProcessorDoesNotOverrideRegularBeanDefinitionsEvenWithScopedProxy() {
131+
RootBeanDefinition rbd = new RootBeanDefinition(TestBean.class);
132+
rbd.setResource(new DescriptiveResource("XML or something"));
133+
BeanDefinitionHolder proxied = ScopedProxyUtils.createScopedProxy(new BeanDefinitionHolder(rbd, "bar"), beanFactory, true);
134+
beanFactory.registerBeanDefinition("bar", proxied.getBeanDefinition());
135+
beanFactory.registerBeanDefinition("config", new RootBeanDefinition(SingletonBeanConfig.class));
136+
ConfigurationClassPostProcessor pp = new ConfigurationClassPostProcessor();
137+
pp.postProcessBeanFactory(beanFactory);
138+
beanFactory.getBean("foo", Foo.class);
139+
beanFactory.getBean("bar", TestBean.class);
140+
}
141+
127142
@Test
128143
public void testProcessingAllowedOnlyOncePerProcessorRegistryPair() {
129144
DefaultListableBeanFactory bf1 = new DefaultListableBeanFactory();

0 commit comments

Comments
 (0)