diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
index 6e3ad642ede..e30989ad96c 100644
--- a/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
+++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractAutowireCapableBeanFactory.java
@@ -911,6 +911,11 @@ public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFac
// static factory method signature or from class inheritance hierarchy...
return getTypeForFactoryBeanFromMethod(mbd.getBeanClass(), factoryMethodName);
}
+
+ result = getFactoryBeanGeneric(mbd.targetType);
+ if (result.resolve() != null) {
+ return result;
+ }
result = getFactoryBeanGeneric(beanType);
if (result.resolve() != null) {
return result;
diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
index 7f7ab566852..5397168264b 100644
--- a/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
+++ b/spring-beans/src/test/java/org/springframework/beans/factory/DefaultListableBeanFactoryTests.java
@@ -2032,6 +2032,16 @@ class DefaultListableBeanFactoryTests {
assertBeanNamesForType(FactoryBean.class, false, false);
}
+ @Test // gh-30987
+ void getBeanNamesForTypeWithFactoryBeanDefinedAsTargetType() {
+ RootBeanDefinition beanDefinition = new RootBeanDefinition(TestRepositoryFactoryBean.class);
+ beanDefinition.setTargetType(ResolvableType.forClassWithGenerics(TestRepositoryFactoryBean.class,
+ CityRepository.class, Object.class, Object.class));
+ lbf.registerBeanDefinition("factoryBean", beanDefinition);
+ assertBeanNamesForType(TestRepositoryFactoryBean.class, true, false, "&factoryBean");
+ assertBeanNamesForType(CityRepository.class, true, false, "factoryBean");
+ }
+
/**
* Verifies that a dependency on a {@link FactoryBean} can not
* be autowired by name, as & is an illegal character in
@@ -3120,6 +3130,25 @@ class DefaultListableBeanFactoryTests {
}
+ public static class TestRepositoryFactoryBean, S, ID extends Serializable>
+ extends RepositoryFactoryBeanSupport {
+
+ @Override
+ public T getObject() throws Exception {
+ throw new IllegalArgumentException("Should not be called");
+ }
+
+ @Override
+ public Class> getObjectType() {
+ throw new IllegalArgumentException("Should not be called");
+ }
+ }
+
+ public record City(String name) {}
+
+ public static class CityRepository implements Repository {}
+
+
public static class LazyInitFactory implements FactoryBean