From 3a4b5c2ade840427e983a75cf2ff79939ced339c Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Tue, 10 Jul 2018 19:28:12 +0200 Subject: [PATCH] RootBeanDefinition publicly exposes target type as ResolvableType Issue: SPR-17028 --- .../beans/factory/support/RootBeanDefinition.java | 13 +++++++++++++ .../AutowiredAnnotationBeanPostProcessorTests.java | 7 +++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java index ce9b93ade3..f2af6a31b7 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/RootBeanDefinition.java @@ -322,6 +322,19 @@ public class RootBeanDefinition extends AbstractBeanDefinition { return (targetType != null ? targetType.resolve() : null); } + /** + * Return a {@link ResolvableType} for this bean definition, + * either from runtime-cached type information or from configuration-time + * {@link #setTargetType(ResolvableType)} or {@link #setBeanClass(Class)}. + * @since 5.1 + * @see #getTargetType() + * @see #getBeanClass() + */ + public ResolvableType getResolvableType() { + ResolvableType targetType = this.targetType; + return (targetType != null ? targetType : ResolvableType.forClass(getBeanClass())); + } + /** * Specify a factory method name that refers to a non-overloaded method. */ diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java index 463dba2ed0..cca9bdbb1f 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessorTests.java @@ -2363,6 +2363,7 @@ public class AutowiredAnnotationBeanPostProcessorTests { GenericInterface1Impl bean1 = (GenericInterface1Impl) bf.getBean("bean1"); GenericInterface2Impl bean2 = (GenericInterface2Impl) bf.getBean("bean2"); assertSame(bean2, bean1.gi2); + assertEquals(ResolvableType.forClass(GenericInterface1Impl.class), bd.getResolvableType()); } @Test @@ -2381,6 +2382,7 @@ public class AutowiredAnnotationBeanPostProcessorTests { GenericInterface1Impl bean1 = (GenericInterface1Impl) bf.getBean("bean1"); GenericInterface2Impl bean2 = (GenericInterface2Impl) bf.getBean("bean2"); assertSame(bean2, bean1.gi2); + assertEquals(ResolvableType.forClass(GenericInterface1Impl.class), bd.getResolvableType()); } @Test @@ -2401,7 +2403,6 @@ public class AutowiredAnnotationBeanPostProcessorTests { GenericInterface1Impl bean1 = (GenericInterface1Impl) bf.getBean("bean1"); GenericInterface2Impl bean2 = (GenericInterface2Impl) bf.getBean("bean2"); assertSame(bean2, bean1.gi2); - assertArrayEquals(new String[] {"bean1"}, bf.getBeanNamesForType(ResolvableType.forClassWithGenerics(GenericInterface1.class, String.class))); assertArrayEquals(new String[] {"bean2"}, bf.getBeanNamesForType(ResolvableType.forClassWithGenerics(GenericInterface2.class, String.class))); } @@ -2428,7 +2429,7 @@ public class AutowiredAnnotationBeanPostProcessorTests { } @Test - public void testGenericsBasedInjectionWithBeanDefinitionTargetResolvableType() throws Exception { + public void testGenericsBasedInjectionWithBeanDefinitionTargetResolvableType() { DefaultListableBeanFactory bf = new DefaultListableBeanFactory(); bf.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver()); AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor(); @@ -2443,6 +2444,8 @@ public class AutowiredAnnotationBeanPostProcessorTests { bf.registerBeanDefinition("bean3", new RootBeanDefinition(MultiGenericFieldInjection.class)); assertEquals("bean1 a bean2 123", bf.getBean("bean3").toString()); + assertEquals(ResolvableType.forClassWithGenerics(GenericInterface2Bean.class, String.class), bd1.getResolvableType()); + assertEquals(ResolvableType.forClassWithGenerics(GenericInterface2Bean.class, Integer.class), bd2.getResolvableType()); } @Test