41
41
import org .springframework .beans .factory .config .ConfigurableBeanFactory ;
42
42
import org .springframework .beans .factory .config .ConstructorArgumentValues ;
43
43
import org .springframework .beans .factory .config .ConstructorArgumentValues .ValueHolder ;
44
+ import org .springframework .beans .factory .support .AbstractBeanDefinition ;
44
45
import org .springframework .beans .factory .support .RootBeanDefinition ;
45
46
import org .springframework .core .ResolvableType ;
46
47
import org .springframework .core .annotation .MergedAnnotations ;
@@ -69,7 +70,7 @@ Executable detectBeanInstanceExecutable(BeanDefinition beanDefinition) {
69
70
Supplier <ResolvableType > beanType = () -> getBeanType (beanDefinition );
70
71
List <ResolvableType > valueTypes = beanDefinition .hasConstructorArgumentValues ()
71
72
? determineParameterValueTypes (beanDefinition .getConstructorArgumentValues ()) : Collections .emptyList ();
72
- Method resolvedFactoryMethod = resolveFactoryMethod (beanDefinition , beanType , valueTypes );
73
+ Method resolvedFactoryMethod = resolveFactoryMethod (beanDefinition , valueTypes );
73
74
if (resolvedFactoryMethod != null ) {
74
75
return resolvedFactoryMethod ;
75
76
}
@@ -129,8 +130,7 @@ private ResolvableType extractTypeFromBeanDefinition(ResolvableType type) {
129
130
return type ;
130
131
}
131
132
132
- private Method resolveFactoryMethod (BeanDefinition beanDefinition , Supplier <ResolvableType > beanType ,
133
- List <ResolvableType > valueTypes ) {
133
+ private Method resolveFactoryMethod (BeanDefinition beanDefinition , List <ResolvableType > valueTypes ) {
134
134
if (beanDefinition instanceof RootBeanDefinition ) {
135
135
RootBeanDefinition rootBeanDefinition = (RootBeanDefinition ) beanDefinition ;
136
136
Method resolvedFactoryMethod = rootBeanDefinition .getResolvedFactoryMethod ();
@@ -141,8 +141,12 @@ private Method resolveFactoryMethod(BeanDefinition beanDefinition, Supplier<Reso
141
141
String factoryMethodName = beanDefinition .getFactoryMethodName ();
142
142
if (factoryMethodName != null ) {
143
143
List <Method > methods = new ArrayList <>();
144
- ReflectionUtils .doWithMethods (beanType .get ().toClass (), methods ::add ,
145
- (method ) -> isFactoryMethodCandidate (beanDefinition , method , factoryMethodName ));
144
+ Class <?> beanClass = getBeanClass (beanDefinition );
145
+ if (beanClass == null ) {
146
+ throw new IllegalStateException ("Failed to determine bean class of " + beanDefinition );
147
+ }
148
+ ReflectionUtils .doWithMethods (beanClass , methods ::add ,
149
+ (method ) -> isFactoryMethodCandidate (beanClass , method , factoryMethodName ));
146
150
if (methods .size () >= 1 ) {
147
151
Function <Method , List <ResolvableType >> parameterTypesFactory = (method ) -> {
148
152
List <ResolvableType > types = new ArrayList <>();
@@ -157,10 +161,10 @@ private Method resolveFactoryMethod(BeanDefinition beanDefinition, Supplier<Reso
157
161
return null ;
158
162
}
159
163
160
- private boolean isFactoryMethodCandidate (BeanDefinition beanDefinition , Method method , String factoryMethodName ) {
164
+ private boolean isFactoryMethodCandidate (Class <?> beanClass , Method method , String factoryMethodName ) {
161
165
if (method .getName ().equals (factoryMethodName )) {
162
166
if (Modifier .isStatic (method .getModifiers ())) {
163
- return method .getDeclaringClass ().equals (getBeanType ( beanDefinition ). toClass () );
167
+ return method .getDeclaringClass ().equals (beanClass );
164
168
}
165
169
return !Modifier .isPrivate (method .getModifiers ());
166
170
}
@@ -314,6 +318,14 @@ private Class<?> getFactoryBeanClass(BeanDefinition beanDefinition) {
314
318
return null ;
315
319
}
316
320
321
+ private Class <?> getBeanClass (BeanDefinition beanDefinition ) {
322
+ if (beanDefinition instanceof AbstractBeanDefinition ) {
323
+ AbstractBeanDefinition abd = (AbstractBeanDefinition ) beanDefinition ;
324
+ return abd .hasBeanClass () ? abd .getBeanClass () : loadClass (abd .getBeanClassName ());
325
+ }
326
+ return (beanDefinition .getBeanClassName () != null ) ? loadClass (beanDefinition .getBeanClassName ()) : null ;
327
+ }
328
+
317
329
private ResolvableType getBeanType (BeanDefinition beanDefinition ) {
318
330
ResolvableType resolvableType = beanDefinition .getResolvableType ();
319
331
if (resolvableType != ResolvableType .NONE ) {
0 commit comments