源码:
initialize
|- setListeners
|- setListeners
|- deduceMainApplicationClass
private void initialize(Object[] sources) {
略...
this.mainApplicationClass = deduceMainApplicationClass();
}
deduceMainApplicationClass
方法通过创建 RuntimeException 对象来获取当前程序的调用栈,然后拿到调用栈中的 main 方法(唯一 一个)所属类的Class,这就是Spring Boot 应用主启动类的 Class
private Class<?> deduceMainApplicationClass() {
try {
// 获取当前程序的调用栈
StackTraceElement[] stackTrace = new RuntimeException().getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
if ("main".equals(stackTraceElement.getMethodName())) {
return Class.forName(stackTraceElement.getClassName());
}
}
}
catch (ClassNotFoundException ex) {
// Swallow and continue
}
return null;
}