diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java index 1f8c483db66b..6ee57aecbe44 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanFactory.java @@ -208,7 +208,7 @@ public T getBean(String name, Class requiredType) throws BeansException { public T getBean(String name, ParameterizedTypeReference typeReference) throws BeansException { Object bean = getBean(name); Type requiredType = typeReference.getType(); - if (!ResolvableType.forType(requiredType).isInstance(bean)) { + if (!isTypeMatch(name, ResolvableType.forType(requiredType), true)) { throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } return (T) bean; diff --git a/spring-context/src/test/java/org/springframework/cache/config/ExpressionCachingIntegrationTests.java b/spring-context/src/test/java/org/springframework/cache/config/ExpressionCachingIntegrationTests.java index 6d1e3aab6d53..de0385fd064c 100644 --- a/spring-context/src/test/java/org/springframework/cache/config/ExpressionCachingIntegrationTests.java +++ b/spring-context/src/test/java/org/springframework/cache/config/ExpressionCachingIntegrationTests.java @@ -27,20 +27,21 @@ import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.ParameterizedTypeReference; /** * @author Stephane Nicoll + * @author Yanming Zhou */ class ExpressionCachingIntegrationTests { @Test // SPR-11692 - @SuppressWarnings("unchecked") void expressionIsCacheBasedOnActualMethod() { ConfigurableApplicationContext context = new AnnotationConfigApplicationContext(SharedConfig.class, Spr11692Config.class); - BaseDao userDao = (BaseDao) context.getBean("userDao"); - BaseDao orderDao = (BaseDao) context.getBean("orderDao"); + BaseDao userDao = context.getBean("userDao", new ParameterizedTypeReference<>() {}); + BaseDao orderDao = context.getBean("orderDao", new ParameterizedTypeReference<>() {}); userDao.persist(new User("1")); orderDao.persist(new Order("2"));