@@ -594,7 +594,7 @@ private void registerDependentBeans(@Nullable String beanName, Set<String> autow
594
594
* Resolve the specified cached method argument or field value.
595
595
*/
596
596
@ Nullable
597
- private Object resolvedCachedArgument (@ Nullable String beanName , @ Nullable Object cachedArgument ) {
597
+ private Object resolveCachedArgument (@ Nullable String beanName , @ Nullable Object cachedArgument ) {
598
598
if (cachedArgument instanceof DependencyDescriptor ) {
599
599
DependencyDescriptor descriptor = (DependencyDescriptor ) cachedArgument ;
600
600
Assert .state (this .beanFactory != null , "No BeanFactory available" );
@@ -629,10 +629,12 @@ protected void inject(Object bean, @Nullable String beanName, @Nullable Property
629
629
Object value ;
630
630
if (this .cached ) {
631
631
try {
632
- value = resolvedCachedArgument (beanName , this .cachedFieldValue );
632
+ value = resolveCachedArgument (beanName , this .cachedFieldValue );
633
633
}
634
- catch (NoSuchBeanDefinitionException ex ) {
635
- // Unexpected removal of target bean for cached argument -> re-resolve
634
+ catch (BeansException ex ) {
635
+ // Unexpected target bean mismatch for cached argument -> re-resolve
636
+ this .cached = false ;
637
+ logger .debug ("Failed to resolve cached argument" , ex );
636
638
value = resolveFieldValue (field , bean , beanName );
637
639
}
638
640
}
@@ -661,9 +663,8 @@ private Object resolveFieldValue(Field field, Object bean, @Nullable String bean
661
663
}
662
664
synchronized (this ) {
663
665
if (!this .cached ) {
664
- Object cachedFieldValue = null ;
665
666
if (value != null || this .required ) {
666
- cachedFieldValue = desc ;
667
+ Object cachedFieldValue = desc ;
667
668
registerDependentBeans (beanName , autowiredBeanNames );
668
669
if (value != null && autowiredBeanNames .size () == 1 ) {
669
670
String autowiredBeanName = autowiredBeanNames .iterator ().next ();
@@ -673,9 +674,13 @@ private Object resolveFieldValue(Field field, Object bean, @Nullable String bean
673
674
desc , autowiredBeanName , field .getType ());
674
675
}
675
676
}
677
+ this .cachedFieldValue = cachedFieldValue ;
678
+ this .cached = true ;
679
+ }
680
+ else {
681
+ this .cachedFieldValue = null ;
682
+ // cached flag remains false
676
683
}
677
- this .cachedFieldValue = cachedFieldValue ;
678
- this .cached = true ;
679
684
}
680
685
}
681
686
return value ;
@@ -709,10 +714,12 @@ protected void inject(Object bean, @Nullable String beanName, @Nullable Property
709
714
Object [] arguments ;
710
715
if (this .cached ) {
711
716
try {
712
- arguments = resolveCachedArguments (beanName );
717
+ arguments = resolveCachedArguments (beanName , this . cachedMethodArguments );
713
718
}
714
- catch (NoSuchBeanDefinitionException ex ) {
715
- // Unexpected removal of target bean for cached argument -> re-resolve
719
+ catch (BeansException ex ) {
720
+ // Unexpected target bean mismatch for cached argument -> re-resolve
721
+ this .cached = false ;
722
+ logger .debug ("Failed to resolve cached argument" , ex );
716
723
arguments = resolveMethodArguments (method , bean , beanName );
717
724
}
718
725
}
@@ -731,14 +738,13 @@ protected void inject(Object bean, @Nullable String beanName, @Nullable Property
731
738
}
732
739
733
740
@ Nullable
734
- private Object [] resolveCachedArguments (@ Nullable String beanName ) {
735
- Object [] cachedMethodArguments = this .cachedMethodArguments ;
741
+ private Object [] resolveCachedArguments (@ Nullable String beanName , @ Nullable Object [] cachedMethodArguments ) {
736
742
if (cachedMethodArguments == null ) {
737
743
return null ;
738
744
}
739
745
Object [] arguments = new Object [cachedMethodArguments .length ];
740
746
for (int i = 0 ; i < arguments .length ; i ++) {
741
- arguments [i ] = resolvedCachedArgument (beanName , cachedMethodArguments [i ]);
747
+ arguments [i ] = resolveCachedArgument (beanName , cachedMethodArguments [i ]);
742
748
}
743
749
return arguments ;
744
750
}
@@ -771,7 +777,7 @@ private Object[] resolveMethodArguments(Method method, Object bean, @Nullable St
771
777
synchronized (this ) {
772
778
if (!this .cached ) {
773
779
if (arguments != null ) {
774
- DependencyDescriptor [] cachedMethodArguments = Arrays .copyOf (descriptors , arguments . length );
780
+ DependencyDescriptor [] cachedMethodArguments = Arrays .copyOf (descriptors , argumentCount );
775
781
registerDependentBeans (beanName , autowiredBeans );
776
782
if (autowiredBeans .size () == argumentCount ) {
777
783
Iterator <String > it = autowiredBeans .iterator ();
@@ -786,11 +792,12 @@ private Object[] resolveMethodArguments(Method method, Object bean, @Nullable St
786
792
}
787
793
}
788
794
this .cachedMethodArguments = cachedMethodArguments ;
795
+ this .cached = true ;
789
796
}
790
797
else {
791
798
this .cachedMethodArguments = null ;
799
+ // cached flag remains false
792
800
}
793
- this .cached = true ;
794
801
}
795
802
}
796
803
return arguments ;
0 commit comments