@@ -309,6 +309,7 @@ private static class BeanMethodInterceptor implements MethodInterceptor, Conditi
309309 * super implementation of the proxied method i.e., the actual {@code @Bean} method
310310 */
311311 @ Override
312+ @ Nullable
312313 public Object intercept (Object enhancedConfigInstance , Method beanMethod , Object [] beanMethodArgs ,
313314 MethodProxy cglibMethodProxy ) throws Throwable {
314315
@@ -360,10 +361,11 @@ public Object intercept(Object enhancedConfigInstance, Method beanMethod, Object
360361 return cglibMethodProxy .invokeSuper (enhancedConfigInstance , beanMethodArgs );
361362 }
362363
363- return obtainBeanInstanceFromFactory (beanMethod , beanMethodArgs , beanFactory , beanName );
364+ return resolveBeanReference (beanMethod , beanMethodArgs , beanFactory , beanName );
364365 }
365366
366- private Object obtainBeanInstanceFromFactory (Method beanMethod , Object [] beanMethodArgs ,
367+ @ Nullable
368+ private Object resolveBeanReference (Method beanMethod , Object [] beanMethodArgs ,
367369 ConfigurableBeanFactory beanFactory , String beanName ) {
368370
369371 // 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
390392 Object beanInstance = (useArgs ? beanFactory .getBean (beanName , beanMethodArgs ) :
391393 beanFactory .getBean (beanName ));
392394 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 " +
394406 "for type [%s] but overridden by non-compatible bean instance of type [%s]." ,
395407 beanMethod .getDeclaringClass ().getSimpleName (), beanMethod .getName (),
396408 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 );
403417 }
404- throw new IllegalStateException (msg );
405418 }
406419 Method currentlyInvoked = SimpleInstantiationStrategy .getCurrentlyInvokedFactoryMethod ();
407420 if (currentlyInvoked != null ) {
0 commit comments