org/springframework/core/convert/support/GenericConversionService
542 @Nullable
543 public GenericConverter find(TypeDescriptor sourceType, TypeDescriptor targetType) {
544 // Search the full type hierarchy
545 List<Class<?>> sourceCandidates = getClassHierarchy(sourceType.getType());
546 List<Class<?>> targetCandidates = getClassHierarchy(targetType.getType());
547 for (Class<?> sourceCandidate : sourceCandidates) {
548 for (Class<?> targetCandidate : targetCandidates) {
549 ConvertiblePair convertiblePair = new ConvertiblePair(sourceCandidate, targetCandidate);
550 GenericConverter converter = getRegisteredConverter(sourceType, targetType, convertiblePair);
551 if (converter != null) {
552 return converter;
553 }
554 }
555 }
556 return null;
557 }
558
559 @Nullable
560 private GenericConverter getRegisteredConverter(TypeDescriptor sourceType,
561 TypeDescriptor targetType, ConvertiblePair convertiblePair) {
562
563 // Check specifically registered converters
564 ConvertersForPair convertersForPair = this.converters.get(convertiblePair);
565 if (convertersForPair != null) {
566 GenericConverter converter = convertersForPair.getConverter(sourceType, targetType);
567 if (converter != null) {
568 return converter;
569 }
570 }
571 // Check ConditionalConverters for a dynamic match
572 for (GenericConverter globalConverter : this.globalConverters) {
573 if (((ConditionalConverter) globalConverter).matches(sourceType, targetType)) {
574 return globalConverter;
575 }
576 }
577 return null;
578 }
line 550 maybe
GenericConverter converter = getRegisteredConverter(TypeDescriptor.valueOf(sourceCandidate), TypeDescriptor.valueOf(targetCandidate), convertiblePair);
not
GenericConverter converter = getRegisteredConverter(sourceType, targetType, convertiblePair);
because line572-576 repeat execute many times with same paramters sourceType and targetType