通过 new RuntimeException().getStackTrace()
从方法调用栈的栈帧 StackTraceElement 里面来找到主启动类
执行流程
// 获取initializer, 排序
SpringApplication application = new SpringApplication(primaryClass);
application.run();
// 利用前面分类好的bootstrapInitializer来初始化DefaultBootstrapContext
createBootstrapContext();
// 为系统变量 SYSTEM_PROPERTY_JAVA_AWT_HEADLESS 设置默认值为 "true"
configureHeadlessProperty();
SpringApplicationRunListeners listeners = new SpringApplicationRunListeners();
// 比较复杂, 暂时略过
listeners.starting(bootstrapContext, this.mainApplicationClass);
// Servlet方式, 非WebFlux方式
ConfigurableEnvironment environment = new ApplicationServletEnvironment();
// 类型转换器的设置(核心方法)
ApplicationConversionService conversionService = new ApplicationConversionService();
// 添加各种类型转换器和类型转换器工厂, GenericConversionService
conversionService.addConverterFactory(converterFactory);
// 获取factory上的两个泛型: FromType 和 ToType
ResolvableType[] typeInfo = getRequiredTypeInfo(factory.getClass(), ConverterFactory.class);
addConverter(new ConverterFactoryAdapter(factory, new ConvertiblePair(typeInfo[0].toClass(), typeInfo[1].toClass())));
ConverterFactory、ConvertiblePair 和 Converter 类
- ConverterFactory 通过调用
getConverter()
来获取具体的 Converter - ConvertiblePair 封装 ConverterFactory 中的两个泛型:sourceType 和 targetType
final class NumberToNumberConverterFactory implements ConverterFactory<Number, Number>, ConditionalConverter {
@Override
public <T extends Number> Converter<Number, T> getConverter(Class<T> targetType) {
return new NumberToNumber<>(targetType);
}
// Integer没有必要转换成Integer
@Override
public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
return !sourceType.equals(targetType);
}
private static final class NumberToNumber<T extends Number> implements Converter<Number, T> {
private final Class<T> targetType;
NumberToNumber(Class<T> targetType) {
this.targetType = targetType;
}
@Override
public T convert(Number source) {
return NumberUtils.convertNumberToTargetClass(source, this.targetType);
}
}
}