Spring Boot技术内幕:架构设计与实现原理
上QQ阅读APP看书,第一时间看更新

3.7 入口类推断

创建SpringApplication的最后一步便是推断入口类,我们通过调用自身的deduce-MainApplicationClass方法来进行入口类的推断。


private Class<?> deduceMainApplicationClass() {
    try {
        // 获取栈元素数组
        StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
        // 遍历栈元素数组
        for (StackTraceElement stackTraceElement : stackTrace) {
            // 匹配第一个main方法,并返回
            if ("main".equals(stackTraceElement.getMethodName())) {
                return Class.forName(stackTraceElement.getClassName());
            }
        }
    } catch (ClassNotFoundException ex) {
        // 如果发生异常,忽略该异常,并继续执行
    }
    return null;
}

该方法实现的基本流程就是先创建一个运行时异常,然后获得栈数组,遍历栈数组,判断类的方法中是否包含main方法。第一个被匹配的类会通过Class.forName方法创建对象,并将其被返回,最后在上层方法中将对象赋值给SpringApplication的成员变量mainApplicationClass。在遍历过程中如果发生异常,会忽略掉该异常并继续执行遍历操作。

至此,整个SpringApplication类的实例化过程便完成了。