Merge branch '6.0.x'
This commit is contained in:
commit
0e9cd2a35f
|
|
@ -832,14 +832,18 @@ class ConstructorResolver {
|
||||||
}
|
}
|
||||||
catch (BeansException ex) {
|
catch (BeansException ex) {
|
||||||
// Unexpected target bean mismatch for cached argument -> re-resolve
|
// Unexpected target bean mismatch for cached argument -> re-resolve
|
||||||
synchronized (descriptor) {
|
Set<String> autowiredBeanNames = null;
|
||||||
if (!descriptor.hasShortcut()) {
|
if (descriptor.hasShortcut()) {
|
||||||
throw ex;
|
// Reset shortcut and try to re-resolve it in this thread...
|
||||||
}
|
|
||||||
descriptor.setShortcut(null);
|
descriptor.setShortcut(null);
|
||||||
Set<String> autowiredBeanNames = new LinkedHashSet<>(2);
|
autowiredBeanNames = new LinkedHashSet<>(2);
|
||||||
argValue = resolveAutowiredArgument(descriptor, paramType, beanName,
|
}
|
||||||
autowiredBeanNames, converter, true);
|
logger.debug("Failed to resolve cached argument", ex);
|
||||||
|
argValue = resolveAutowiredArgument(descriptor, paramType, beanName,
|
||||||
|
autowiredBeanNames, converter, true);
|
||||||
|
if (autowiredBeanNames != null && !descriptor.hasShortcut()) {
|
||||||
|
// We encountered as stale shortcut before, and the shortcut has
|
||||||
|
// not been re-resolved by another thread in the meantime...
|
||||||
if (argValue != null) {
|
if (argValue != null) {
|
||||||
setShortcutIfPossible(descriptor, paramType, autowiredBeanNames);
|
setShortcutIfPossible(descriptor, paramType, autowiredBeanNames);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -423,6 +423,22 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
assertThat(bean.nestedTestBeansField[1]).isSameAs(ntb2);
|
assertThat(bean.nestedTestBeansField[1]).isSameAs(ntb2);
|
||||||
|
|
||||||
bf.destroySingleton("testBean");
|
bf.destroySingleton("testBean");
|
||||||
|
bf.registerSingleton("testBeanX", tb);
|
||||||
|
|
||||||
|
bean = bf.getBean("annotatedBean", OptionalResourceInjectionBean.class);
|
||||||
|
assertThat(bean.getTestBean()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean2()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean3()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean4()).isSameAs(tb);
|
||||||
|
assertThat(bean.getIndexedTestBean()).isSameAs(itb);
|
||||||
|
assertThat(bean.getNestedTestBeans()).hasSize(2);
|
||||||
|
assertThat(bean.getNestedTestBeans()[0]).isSameAs(ntb1);
|
||||||
|
assertThat(bean.getNestedTestBeans()[1]).isSameAs(ntb2);
|
||||||
|
assertThat(bean.nestedTestBeansField).hasSize(2);
|
||||||
|
assertThat(bean.nestedTestBeansField[0]).isSameAs(ntb1);
|
||||||
|
assertThat(bean.nestedTestBeansField[1]).isSameAs(ntb2);
|
||||||
|
|
||||||
|
bf.destroySingleton("testBeanX");
|
||||||
|
|
||||||
bean = bf.getBean("annotatedBean", OptionalResourceInjectionBean.class);
|
bean = bf.getBean("annotatedBean", OptionalResourceInjectionBean.class);
|
||||||
assertThat(bean.getTestBean()).isNull();
|
assertThat(bean.getTestBean()).isNull();
|
||||||
|
|
@ -480,6 +496,22 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
assertThat(bean.nestedTestBeansField[1]).isSameAs(ntb2);
|
assertThat(bean.nestedTestBeansField[1]).isSameAs(ntb2);
|
||||||
|
|
||||||
bf.removeBeanDefinition("testBean");
|
bf.removeBeanDefinition("testBean");
|
||||||
|
bf.registerBeanDefinition("testBeanX", new RootBeanDefinition(TestBean.class));
|
||||||
|
|
||||||
|
bean = bf.getBean("annotatedBean", OptionalResourceInjectionBean.class);
|
||||||
|
assertThat(bean.getTestBean()).isSameAs(bf.getBean("testBeanX"));
|
||||||
|
assertThat(bean.getTestBean2()).isSameAs(bf.getBean("testBeanX"));
|
||||||
|
assertThat(bean.getTestBean3()).isSameAs(bf.getBean("testBeanX"));
|
||||||
|
assertThat(bean.getTestBean4()).isSameAs(bf.getBean("testBeanX"));
|
||||||
|
assertThat(bean.getIndexedTestBean()).isSameAs(itb);
|
||||||
|
assertThat(bean.getNestedTestBeans()).hasSize(2);
|
||||||
|
assertThat(bean.getNestedTestBeans()[0]).isSameAs(ntb1);
|
||||||
|
assertThat(bean.getNestedTestBeans()[1]).isSameAs(ntb2);
|
||||||
|
assertThat(bean.nestedTestBeansField).hasSize(2);
|
||||||
|
assertThat(bean.nestedTestBeansField[0]).isSameAs(ntb1);
|
||||||
|
assertThat(bean.nestedTestBeansField[1]).isSameAs(ntb2);
|
||||||
|
|
||||||
|
bf.removeBeanDefinition("testBeanX");
|
||||||
|
|
||||||
bean = bf.getBean("annotatedBean", OptionalResourceInjectionBean.class);
|
bean = bf.getBean("annotatedBean", OptionalResourceInjectionBean.class);
|
||||||
assertThat(bean.getTestBean()).isNull();
|
assertThat(bean.getTestBean()).isNull();
|
||||||
|
|
@ -768,6 +800,17 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
assertThat(bean.getBeanFactory()).isSameAs(bf);
|
assertThat(bean.getBeanFactory()).isSameAs(bf);
|
||||||
|
|
||||||
bf.destroySingleton("nestedTestBean");
|
bf.destroySingleton("nestedTestBean");
|
||||||
|
bf.registerSingleton("nestedTestBeanX", ntb);
|
||||||
|
|
||||||
|
bean = bf.getBean("annotatedBean", ConstructorResourceInjectionBean.class);
|
||||||
|
assertThat(bean.getTestBean()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean2()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean3()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean4()).isSameAs(tb);
|
||||||
|
assertThat(bean.getNestedTestBean()).isSameAs(ntb);
|
||||||
|
assertThat(bean.getBeanFactory()).isSameAs(bf);
|
||||||
|
|
||||||
|
bf.destroySingleton("nestedTestBeanX");
|
||||||
|
|
||||||
bean = bf.getBean("annotatedBean", ConstructorResourceInjectionBean.class);
|
bean = bf.getBean("annotatedBean", ConstructorResourceInjectionBean.class);
|
||||||
assertThat(bean.getTestBean()).isSameAs(tb);
|
assertThat(bean.getTestBean()).isSameAs(tb);
|
||||||
|
|
@ -806,6 +849,17 @@ public class AutowiredAnnotationBeanPostProcessorTests {
|
||||||
assertThat(bean.getBeanFactory()).isSameAs(bf);
|
assertThat(bean.getBeanFactory()).isSameAs(bf);
|
||||||
|
|
||||||
bf.removeBeanDefinition("nestedTestBean");
|
bf.removeBeanDefinition("nestedTestBean");
|
||||||
|
bf.registerBeanDefinition("nestedTestBeanX", new RootBeanDefinition(NestedTestBean.class));
|
||||||
|
|
||||||
|
bean = bf.getBean("annotatedBean", ConstructorResourceInjectionBean.class);
|
||||||
|
assertThat(bean.getTestBean()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean2()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean3()).isSameAs(tb);
|
||||||
|
assertThat(bean.getTestBean4()).isSameAs(tb);
|
||||||
|
assertThat(bean.getNestedTestBean()).isSameAs(bf.getBean("nestedTestBeanX"));
|
||||||
|
assertThat(bean.getBeanFactory()).isSameAs(bf);
|
||||||
|
|
||||||
|
bf.removeBeanDefinition("nestedTestBeanX");
|
||||||
|
|
||||||
bean = bf.getBean("annotatedBean", ConstructorResourceInjectionBean.class);
|
bean = bf.getBean("annotatedBean", ConstructorResourceInjectionBean.class);
|
||||||
assertThat(bean.getTestBean()).isSameAs(tb);
|
assertThat(bean.getTestBean()).isSameAs(tb);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue