@@ -309,6 +309,7 @@ private static class BeanMethodInterceptor implements MethodInterceptor, Conditi
309
309
* super implementation of the proxied method i.e., the actual {@code @Bean} method
310
310
*/
311
311
@ Override
312
+ @ Nullable
312
313
public Object intercept (Object enhancedConfigInstance , Method beanMethod , Object [] beanMethodArgs ,
313
314
MethodProxy cglibMethodProxy ) throws Throwable {
314
315
@@ -360,10 +361,11 @@ public Object intercept(Object enhancedConfigInstance, Method beanMethod, Object
360
361
return cglibMethodProxy .invokeSuper (enhancedConfigInstance , beanMethodArgs );
361
362
}
362
363
363
- return obtainBeanInstanceFromFactory (beanMethod , beanMethodArgs , beanFactory , beanName );
364
+ return resolveBeanReference (beanMethod , beanMethodArgs , beanFactory , beanName );
364
365
}
365
366
366
- private Object obtainBeanInstanceFromFactory (Method beanMethod , Object [] beanMethodArgs ,
367
+ @ Nullable
368
+ private Object resolveBeanReference (Method beanMethod , Object [] beanMethodArgs ,
367
369
ConfigurableBeanFactory beanFactory , String beanName ) {
368
370
369
371
// The user (i.e. not the factory) is requesting this bean through a call to
@@ -390,18 +392,29 @@ private Object obtainBeanInstanceFromFactory(Method beanMethod, Object[] beanMet
390
392
Object beanInstance = (useArgs ? beanFactory .getBean (beanName , beanMethodArgs ) :
391
393
beanFactory .getBean (beanName ));
392
394
if (!ClassUtils .isAssignableValue (beanMethod .getReturnType (), beanInstance )) {
393
- String msg = String .format ("@Bean method %s.%s called as a bean reference " +
395
+ if (beanInstance .equals (null )) {
396
+ if (logger .isDebugEnabled ()) {
397
+ logger .debug (String .format ("@Bean method %s.%s called as bean reference " +
398
+ "for type [%s] returned null bean; resolving to null value." ,
399
+ beanMethod .getDeclaringClass ().getSimpleName (), beanMethod .getName (),
400
+ beanMethod .getReturnType ().getName ()));
401
+ }
402
+ beanInstance = null ;
403
+ }
404
+ else {
405
+ String msg = String .format ("@Bean method %s.%s called as bean reference " +
394
406
"for type [%s] but overridden by non-compatible bean instance of type [%s]." ,
395
407
beanMethod .getDeclaringClass ().getSimpleName (), beanMethod .getName (),
396
408
beanMethod .getReturnType ().getName (), beanInstance .getClass ().getName ());
397
- try {
398
- BeanDefinition beanDefinition = beanFactory .getMergedBeanDefinition (beanName );
399
- msg += " Overriding bean of same name declared in: " + beanDefinition .getResourceDescription ();
400
- }
401
- catch (NoSuchBeanDefinitionException ex ) {
402
- // Ignore - simply no detailed message then.
409
+ try {
410
+ BeanDefinition beanDefinition = beanFactory .getMergedBeanDefinition (beanName );
411
+ msg += " Overriding bean of same name declared in: " + beanDefinition .getResourceDescription ();
412
+ }
413
+ catch (NoSuchBeanDefinitionException ex ) {
414
+ // Ignore - simply no detailed message then.
415
+ }
416
+ throw new IllegalStateException (msg );
403
417
}
404
- throw new IllegalStateException (msg );
405
418
}
406
419
Method currentlyInvoked = SimpleInstantiationStrategy .getCurrentlyInvokedFactoryMethod ();
407
420
if (currentlyInvoked != null ) {
0 commit comments