@@ -638,7 +638,7 @@ private void registerDependentBeans(@Nullable String beanName, Set<String> autow
638
638
* Resolve the specified cached method argument or field value.
639
639
*/
640
640
@ Nullable
641
- private Object resolvedCachedArgument (@ Nullable String beanName , @ Nullable Object cachedArgument ) {
641
+ private Object resolveCachedArgument (@ Nullable String beanName , @ Nullable Object cachedArgument ) {
642
642
if (cachedArgument instanceof DependencyDescriptor descriptor ) {
643
643
Assert .state (this .beanFactory != null , "No BeanFactory available" );
644
644
return this .beanFactory .resolveDependency (descriptor , beanName , null , null );
@@ -683,10 +683,12 @@ protected void inject(Object bean, @Nullable String beanName, @Nullable Property
683
683
Object value ;
684
684
if (this .cached ) {
685
685
try {
686
- value = resolvedCachedArgument (beanName , this .cachedFieldValue );
686
+ value = resolveCachedArgument (beanName , this .cachedFieldValue );
687
687
}
688
- catch (NoSuchBeanDefinitionException ex ) {
689
- // Unexpected removal of target bean for cached argument -> re-resolve
688
+ catch (BeansException ex ) {
689
+ // Unexpected target bean mismatch for cached argument -> re-resolve
690
+ this .cached = false ;
691
+ logger .debug ("Failed to resolve cached argument" , ex );
690
692
value = resolveFieldValue (field , bean , beanName );
691
693
}
692
694
}
@@ -715,9 +717,8 @@ private Object resolveFieldValue(Field field, Object bean, @Nullable String bean
715
717
}
716
718
synchronized (this ) {
717
719
if (!this .cached ) {
718
- Object cachedFieldValue = null ;
719
720
if (value != null || this .required ) {
720
- cachedFieldValue = desc ;
721
+ Object cachedFieldValue = desc ;
721
722
registerDependentBeans (beanName , autowiredBeanNames );
722
723
if (value != null && autowiredBeanNames .size () == 1 ) {
723
724
String autowiredBeanName = autowiredBeanNames .iterator ().next ();
@@ -727,9 +728,13 @@ private Object resolveFieldValue(Field field, Object bean, @Nullable String bean
727
728
desc , autowiredBeanName , field .getType ());
728
729
}
729
730
}
731
+ this .cachedFieldValue = cachedFieldValue ;
732
+ this .cached = true ;
733
+ }
734
+ else {
735
+ this .cachedFieldValue = null ;
736
+ // cached flag remains false
730
737
}
731
- this .cachedFieldValue = cachedFieldValue ;
732
- this .cached = true ;
733
738
}
734
739
}
735
740
return value ;
@@ -760,10 +765,12 @@ protected void inject(Object bean, @Nullable String beanName, @Nullable Property
760
765
Object [] arguments ;
761
766
if (this .cached ) {
762
767
try {
763
- arguments = resolveCachedArguments (beanName );
768
+ arguments = resolveCachedArguments (beanName , this . cachedMethodArguments );
764
769
}
765
- catch (NoSuchBeanDefinitionException ex ) {
766
- // Unexpected removal of target bean for cached argument -> re-resolve
770
+ catch (BeansException ex ) {
771
+ // Unexpected target bean mismatch for cached argument -> re-resolve
772
+ this .cached = false ;
773
+ logger .debug ("Failed to resolve cached argument" , ex );
767
774
arguments = resolveMethodArguments (method , bean , beanName );
768
775
}
769
776
}
@@ -782,14 +789,13 @@ protected void inject(Object bean, @Nullable String beanName, @Nullable Property
782
789
}
783
790
784
791
@ Nullable
785
- private Object [] resolveCachedArguments (@ Nullable String beanName ) {
786
- Object [] cachedMethodArguments = this .cachedMethodArguments ;
792
+ private Object [] resolveCachedArguments (@ Nullable String beanName , @ Nullable Object [] cachedMethodArguments ) {
787
793
if (cachedMethodArguments == null ) {
788
794
return null ;
789
795
}
790
796
Object [] arguments = new Object [cachedMethodArguments .length ];
791
797
for (int i = 0 ; i < arguments .length ; i ++) {
792
- arguments [i ] = resolvedCachedArgument (beanName , cachedMethodArguments [i ]);
798
+ arguments [i ] = resolveCachedArgument (beanName , cachedMethodArguments [i ]);
793
799
}
794
800
return arguments ;
795
801
}
@@ -822,7 +828,7 @@ private Object[] resolveMethodArguments(Method method, Object bean, @Nullable St
822
828
synchronized (this ) {
823
829
if (!this .cached ) {
824
830
if (arguments != null ) {
825
- DependencyDescriptor [] cachedMethodArguments = Arrays .copyOf (descriptors , arguments . length );
831
+ DependencyDescriptor [] cachedMethodArguments = Arrays .copyOf (descriptors , argumentCount );
826
832
registerDependentBeans (beanName , autowiredBeans );
827
833
if (autowiredBeans .size () == argumentCount ) {
828
834
Iterator <String > it = autowiredBeans .iterator ();
@@ -837,11 +843,12 @@ private Object[] resolveMethodArguments(Method method, Object bean, @Nullable St
837
843
}
838
844
}
839
845
this .cachedMethodArguments = cachedMethodArguments ;
846
+ this .cached = true ;
840
847
}
841
848
else {
842
849
this .cachedMethodArguments = null ;
850
+ // cached flag remains false
843
851
}
844
- this .cached = true ;
845
852
}
846
853
}
847
854
return arguments ;
0 commit comments