范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

你真的了解SpringBoot应用的启动入口么?

  Springboot可以说是Java程序员必备技能了,大家都知道Springboot最终可以通过maven打成jar包,然后直接使用java -jar命令运行一个Web工程(或其它)。这样就避免了原先基于tomcat的web工程的复杂操作。Springboot能够使Web服务的部署简单到如此程度是因为其内置了Jetty(或Tomcat)服务器,并且在容器启动过程中start该服务器,成功运行Web服务。
  本篇并不是深究内置服务器的启动过程,而是追溯Springboot启动之前到底做了什么?它是如何与我们经常写的@SpringBootApplication注解注释的main方法类绑定起来的?1、一切的开始
  相信各位Springbooter一定不会陌生下面的代码,无论是初学Springboot的新同学,或是开始研究Springboot源码的新司机,这段代码几乎是我们的落脚点。我们如此熟悉它,以至于认为它就是Springboot这个魔法乐园的起点。但真的是这样吗? @SpringBootApplication  public class Springboot01helloworldApplication {      public static void main(String[] args) {          SpringApplication.run(Springboot01helloworldApplication.class, args);      }  } 复制代码
  我们都知道,一个Java工程打包过后,这个jar包的入口描述被写在了/META-INF/MANIFEST.MF文件下,下面让我们来看看这个文件内容: Manifest-Version: 1.0  Archiver-Version: Plexus Archiver  Built-By: MrXu  Start-Class: com.vivo.internet.nex.repeater.console.RepeaterConsoleApplication  Spring-Boot-Classes: BOOT-INF/classes/  Spring-Boot-Lib: BOOT-INF/lib/  Spring-Boot-Version: 1.5.19.RELEASE  Created-By: Apache Maven 3.8.1  Build-Jdk: 1.8.0_281  Main-Class: org.springframework.boot.loader.JarLauncher 复制代码
  文件入口的描述为Main-Class对应的value,即org.springframework.boot.loader.JarLauncher。那么,接下来我们需要看下这个人类究竟做了什么? // JarLauncher.java  public class JarLauncher extends ExecutableArchiveLauncher {      static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";      static final String BOOT_INF_LIB = "BOOT-INF/lib/";      public JarLauncher() {      }      // ...省略无关代码      public static void main(String[] args) throws Exception {          (new JarLauncher()).launch(args);      }  } 复制代码
  明显的main函数吸引了我们的注意,没错了,这就是入口,看看JarLauncher的空构造并没有任何代码,我们先往它的父类找找: // ExecutableArchiveLauncher.java  public abstract class ExecutableArchiveLauncher extends Launcher {      public ExecutableArchiveLauncher() {          try {              this.archive = this.createArchive();          } catch (Exception var2) {              throw new IllegalStateException(var2);          }      }      // ...省略  }    // Launcher.java  public abstract class Launcher {      public Launcher() {}      // ...省略无关代码  }    复制代码
  从代码中可以看出,真正干了事情的父类是ExecutableArchiveLauncher,它在初始化时构造了archive实例,该实例封装了/META-INF/MANIFEST.MF文件的信息。后面我们也会用到它。
  随后便是launch方法,我们只关系核心执行流程: // Launcher.java  protected void launch(String[] args) throws Exception {      JarFile.registerUrlProtocolHandler();      ClassLoader classLoader = this.createClassLoader(this.getClassPathArchives());      this.launch(args, this.getMainClass(), classLoader);  }     // ExecutableArchiveLauncher.java  protected String getMainClass() throws Exception {      Manifest manifest = this.archive.getManifest();      String mainClass = null;      if (manifest != null) {          mainClass = manifest.getMainAttributes().getValue("Start-Class");      }         if (mainClass == null) {          throw new IllegalStateException("No "Start-Class" manifest entry specified in " + this);      } else {          return mainClass;      }  }    复制代码
  这里首先调用子类ExecutableArchiveLauncher的getMainClass方法,主要逻辑就是从/META-INF/MANIFEST.MF文件中获取Start-Class信息,对应上文就是com.vivo.internet.nex.repeater.console.RepeaterConsoleApplication字符串,这样就和我们写的启动类关联上了。
  然后是launch方法的具体执行,launch()首先创建一个MainMethodRunner,将上文获取的Start-Class和透传的参数传递进去,然后调用MainMethodRunner的run方法。run方法的执行也非常简单,就是加载Start-Class对应的启动类,然后反射调用启动类的main方法。之后就是容器的初始化过程了。 // Launcher.java  protected void launch(String[] args, String mainClass, ClassLoader classLoader) throws Exception {      Thread.currentThread().setContextClassLoader(classLoader);      // 这里首先调用createMainMethodRunner创建一个MainMethodRunner实例,将mainClass和args参数传入。随后调用      this.createMainMethodRunner(mainClass, args, classLoader).run();  }  protected MainMethodRunner createMainMethodRunner(String mainClass, String[] args, ClassLoader classLoader) {      return new MainMethodRunner(mainClass, args);  }     // MainMethodRunner.java  public MainMethodRunner(String mainClass, String[] args) {      this.mainClassName = mainClass;      this.args = args != null ? (String[])args.clone() : null;  }  public void run() throws Exception {      Class<?> mainClass = Thread.currentThread().getContextClassLoader().loadClass(this.mainClassName);      Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);      mainMethod.invoke((Object)null, this.args);  } 复制代码2、总结
  综上所述,对于Springboot工程,启动类并不是真正的工程入口,他会被真正的入口反射调用其main方法实现Spring容器的启动。工程入口也是Spring的开发人员为我们"营造的一种假象",抽象出来的逻辑入口。
  作者:Chub
  链接:https://juejin.cn/post/7100386958580563982

如何将物联网的五个维度转变成现实?物联网不是趋势,而是现实,是一个比互联网更大的江湖,而联合这一切的是生态化的物联网企业。未来将有数量巨大的IP地址传感器可穿戴设备,以及虽感觉不到却可与之互动的东西,时时刻刻伴随你地质灾害监测已成为地质勘探的重要指标当前,全球崩塌滑坡泥石流等突发性地质灾害日益增加,地质灾害已经成为一个全球性问题。特别是随着全球气候变暖,地壳活动进入一个相对活跃期,再加上重大工程的开工建设等人类活动的影响,世界物联网产业持续深化,5G赋能助力农业生产物联网技术究竟会为我们生活带来什么改变呢?它和5G之间又有什么关联?物联网将能够更好地将大家联系在一起,能够为大家带来更便捷的服务。今后是一个万物互联的社会,这是智能社会的基础。物种菜不用土,灌溉无需人是什么引起一轮新农潮?自然环境对农业生产的影响特别大我们老一辈的农业生产基本都是靠天吃饭。传统农业在生产的过程中,无论是农作物的种植还是鸡鸭鱼等禽类水产的养殖,都是依靠老一辈的经验判断,没有一个科学有效泥石流地质灾害频发,提前预警成为重中之重泥石流自然灾害7月25日,在印度西部的马哈拉施特拉邦引发了严重的泥石流等灾害。已有至少113人因此丧生,约100人仍失踪。7月26日杭州市公安局萧山区戴村镇青山村石牛山发生泥石流灾井下有毒气体种类及特性分析随着空气污染事态的严峻,空气污染越来越受到人们的关注。空气污染事件此起彼伏,地面的我们就在被污染的空气下生活,而地下矿山工作者由面临着怎样的空气和毒气的污染呢?今天我们就带大家了解山东陕西四川等多地,地质灾害四警齐发近日,水利部和中国气象局联合发布地质灾害气象预警,预计8月22日20时至8月23日20时,山东南部江苏北部安徽北部河南东部和南部湖北东北部和西南部四川东北部等地的部分地区发生渍涝的会写毛笔字茶艺打太极的机器人你见过吗?网友小爱也很棒近日,一段机器人与真人对练太极拳的视频引起网友关注。视频中,一个机器手臂运转灵活,进退自如,与真人展开攻守,甚至还做出了擒拿的复杂动作。这种机器人是由济南企业自主研发的人机协作机器手机AIoT战略持续发力,小米核心技术再获突破,米粉稳了手机AIoT双引擎战略,是雷军在2019年提出。雷军还表示,小米在未来5年至少会在AIoT相关的研发和相关运作活动投入100亿。实际上,在小米手机的基础上,小米的AIoT平台规模已2021上半年手机保值榜5000以上高端机华为屠榜,Redmi表现抢眼这几年来,除了苹果外,很多手机厂商一年都会推出好几款新机,可以想象这个手机迭代更新的速度还是非常快的。对于时刻走在潮流前线的朋友来说,想要一直用性能最强的手机就要一直换新机。对此最曾经的国产iOS!雷军亲自开小号参与内测,央妈也频频点赞说起手机系统,目前主要分为苹果的ios和安卓系统,而安卓又有着非常多的定制UI,比如国内很著名的小米的MIUI魅族的flymeOPPO的ColorOSvivo的OriginOS等等
哈萨克斯坦首都努尔苏丹恢复有线互联网接入据塔斯社1月9日报道,自周六(1月8日)以来在哈萨克斯坦首都努尔苏丹被封锁的有线互联网已于周日恢复,移动互联网连接仍然不可用。当地时间周六15时40分左右(莫斯科时间12时40分)你认为一个安防监控摄像头需要多少钱市场上的安防摄像头或安防系统多少钱?你认为高质量的安防摄像头系统应该是什么价格?当你在思考这个问题时,你需要问自己心中的预算是多少,花费这个价钱是否值得。安防摄像头系统选购指南如果什么是机器学习什么是机器学习?机器学习是人工智能(AI)和计算机科学的一个分支,它侧重于使用数据和算法来模仿人类的学习方式,逐步提高其准确性。IBM在机器学习方面有着悠久的历史亚瑟塞缪尔(Art为什么你的手机越用越卡?只需要看这三点,完美解决手机卡顿问题现在出门不带钱包也要带手机,就光一个出行码就得靠手机了,别说现在越来越便利的手机支付,但是大家可能也发现了,随着手机用的时间越来越久,手机都会出现卡顿的现象,那么怎样才能解决手机卡互联网信用付整改加速落地,京东白条升级为白条信用卡继花呗开启品牌隔离之后,京东科技旗下的白条信用付产品也加速落实互联网平台金融类整改要求。近日,界面新闻记者发现,业内知名的消费贷款产品京东白条悄然对产品进行了升级,升级后的白条产品摩托罗拉MotoGStylus2022款曝光液晶屏耳机孔IT之家1月10日消息,根据外媒notebookcheck报道,摩托罗拉即将推出2022款MotoGStylus机型,目前手机的部分参数以及渲染图已经被知名爆料者OnLeaks曝光小米10系列还能再战三年吗?编者按在今年小米12发布之后,小米的高端化也正式进入第三年,而此时我们想回过头再去看看,两年前的产品小米10系列,在两代高通处理器都如此拉胯之下,搭载高通骁龙865处理器的小米102499元起售的iPad2021到底想干什么?2021版是64G和256G,64G就是2499元,256G是3699元,差了1200元如果嫌64G容量小,那就加1200苹果这种定价策略,可以很直接的提高利润率因为低配版不合算,攀升日报华硕发布全球首款OLED折叠屏笔记本电脑快讯全球首款OLED折叠屏笔记本电脑来了在华为小米OPPO三星等厂商相继推出自家折叠屏手机后,折叠屏市场又迎来了新成员。日前,在CES2022上,全球首款可折叠17。3英寸OLED内核如何防止用户程序访问内核数据?内核如何读取用户态数据?以X86处理器为例,用户的数据和内核的数据在不同的数据段中,用户的代码和内核的代码在不同的段中。每个段的描述信息存储在段描述符表中,描述信息中包含了该段的访问权限。段的选择信息存入与支付宝微信竞争?数字人民币到来,二维码时代或将结束点击关注,每天精彩不断!导读与支付宝微信竞争?数字人民币到来,二维码时代或将结束!众所周知,随着移动互联网的快速发展,我们的生活也在不断地被网络给改变着以前人们出门,都需要携带不少