上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类的实例化过程便完成了。