Skip to content

Commit f55ca30

Browse files
committed
Merge branch '6.2.x'
# Conflicts: # spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java
2 parents 7e9c33f + aa56b50 commit f55ca30

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java

+13-1
Original file line numberDiff line numberDiff line change
@@ -1458,7 +1458,7 @@ protected RootBeanDefinition getMergedBeanDefinition(
14581458
// Cache the merged bean definition for the time being
14591459
// (it might still get re-merged later on in order to pick up metadata changes)
14601460
if (containingBd == null && (isCacheBeanMetadata() || isBeanEligibleForMetadataCaching(beanName))) {
1461-
this.mergedBeanDefinitions.put(beanName, mbd);
1461+
cacheMergedBeanDefinition(mbd, beanName);
14621462
}
14631463
}
14641464
if (previous != null) {
@@ -1487,6 +1487,18 @@ private void copyRelevantMergedBeanDefinitionCaches(RootBeanDefinition previous,
14871487
}
14881488
}
14891489

1490+
/**
1491+
* Cache the given merged bean definition.
1492+
* <p>Subclasses can override this to derive additional cached state
1493+
* from the final post-processed bean definition.
1494+
* @param mbd the merged bean definition to cache
1495+
* @param beanName the name of the bean
1496+
* @since 6.2.6
1497+
*/
1498+
protected void cacheMergedBeanDefinition(RootBeanDefinition mbd, String beanName) {
1499+
this.mergedBeanDefinitions.put(beanName, mbd);
1500+
}
1501+
14901502
/**
14911503
* Check the given merged bean definition,
14921504
* potentially throwing validation exceptions.

spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

+8
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,14 @@ protected boolean isBeanEligibleForMetadataCaching(String beanName) {
10041004
return super.obtainInstanceFromSupplier(supplier, beanName, mbd);
10051005
}
10061006

1007+
@Override
1008+
protected void cacheMergedBeanDefinition(RootBeanDefinition mbd, String beanName) {
1009+
super.cacheMergedBeanDefinition(mbd, beanName);
1010+
if (mbd.isPrimary()) {
1011+
this.primaryBeanNames.add(beanName);
1012+
}
1013+
}
1014+
10071015
@Override
10081016
protected void checkMergedBeanDefinition(RootBeanDefinition mbd, String beanName, @Nullable Object @Nullable [] args) {
10091017
super.checkMergedBeanDefinition(mbd, beanName, args);

spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java

+34
Original file line numberDiff line numberDiff line change
@@ -1727,6 +1727,40 @@ void objectProviderInjectionWithTargetPrimary() {
17271727
tb2.setFactoryMethodName("newTestBean2");
17281728
tb2.setLazyInit(true);
17291729
bf.registerBeanDefinition("testBean2", tb2);
1730+
bf.registerAlias("testBean2", "testBean");
1731+
1732+
ObjectProviderInjectionBean bean = bf.getBean("annotatedBean", ObjectProviderInjectionBean.class);
1733+
TestBean testBean1 = bf.getBean("testBean1", TestBean.class);
1734+
assertThat(bean.getTestBean()).isSameAs(testBean1);
1735+
assertThat(bean.getOptionalTestBean()).isSameAs(testBean1);
1736+
assertThat(bean.consumeOptionalTestBean()).isSameAs(testBean1);
1737+
assertThat(bean.getUniqueTestBean()).isSameAs(testBean1);
1738+
assertThat(bean.consumeUniqueTestBean()).isSameAs(testBean1);
1739+
assertThat(bf.containsSingleton("testBean2")).isFalse();
1740+
1741+
TestBean testBean2 = bf.getBean("testBean2", TestBean.class);
1742+
assertThat(bean.iterateTestBeans()).containsExactly(testBean1, testBean2);
1743+
assertThat(bean.forEachTestBeans()).containsExactly(testBean1, testBean2);
1744+
assertThat(bean.streamTestBeans()).containsExactly(testBean1, testBean2);
1745+
assertThat(bean.streamTestBeansInOrder()).containsExactly(testBean2, testBean1);
1746+
assertThat(bean.allTestBeans()).containsExactly(testBean1, testBean2);
1747+
assertThat(bean.allTestBeansInOrder()).containsExactly(testBean2, testBean1);
1748+
assertThat(bean.allSingletonBeans()).containsExactly(testBean1, testBean2);
1749+
assertThat(bean.allSingletonBeansInOrder()).containsExactly(testBean2, testBean1);
1750+
}
1751+
1752+
@Test
1753+
void objectProviderInjectionWithLateMarkedTargetPrimary() {
1754+
bf.registerBeanDefinition("annotatedBean", new RootBeanDefinition(ObjectProviderInjectionBean.class));
1755+
RootBeanDefinition tb1 = new RootBeanDefinition(TestBeanFactory.class);
1756+
tb1.setFactoryMethodName("newTestBean1");
1757+
bf.registerBeanDefinition("testBean1", tb1);
1758+
RootBeanDefinition tb2 = new RootBeanDefinition(TestBeanFactory.class);
1759+
tb2.setFactoryMethodName("newTestBean2");
1760+
tb2.setLazyInit(true);
1761+
bf.registerBeanDefinition("testBean2", tb2);
1762+
bf.registerAlias("testBean2", "testBean");
1763+
tb1.setPrimary(true);
17301764

17311765
ObjectProviderInjectionBean bean = bf.getBean("annotatedBean", ObjectProviderInjectionBean.class);
17321766
TestBean testBean1 = bf.getBean("testBean1", TestBean.class);

0 commit comments

Comments
 (0)