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

SpringBoot启动控制台的banner是怎么回事

  前言
  每次启动SpringBoot项目时,总是能看到控制台打印了一串字符,隐约能辨认出是"Spring",不知大家是否也好奇过是怎么实现的,是直接打印固定的字符串,还是根据什么算法去生成的?于是闲暇无事,探究一番。
  只想修改banner可以跳到文末查看SpringBoot是怎么打印的Banner默认实现类 SpringBootBanner
  1、根据控制台打印的字符进行全局搜索,笔者选取  :: Spring Boot ::  进行搜索,定位到了 org.springframework.boot.SpringBootBanner  。
  IDEA全局搜索:CTRL + SHIFT + R
  2、进入  SpringBootBanner  类,先看下注释 Default Banner implementation which writes the "Spring" banner.  ,说了两个信息:1、当前类是SpringBoot Banner的默认实现;2、打印的字符是"Spring"。
  3、往下看,  SpringBootBanner  实现了 Banner  接口。 Banner  包括 printBanner  方法和枚举 Mode  。
  根据 Mode  中的注释和枚举值可以看出, Banner  有三种状态:关闭、打印到控制台、打印到日志。具体使用场景留待后续分析。 Banner源码
  4、往下看到类的属性  BANNER  和 SPRING_BOOT  ,也能辨认出是控制台打印的那些字符。
  类里面只有一个方法  printBanner  ,负责打印Banner字符。逻辑比较清晰,第一部分逐行打印 BANNER  形成图案;第二部分打印SpringBoot版本号,总长度由 STRAP_LINE_SIZE  控制。 SpringBootBanner完整代码Banner核心控制类 SpringApplicationBannerPrinter
  1、上节找到了负责存储和打印Banner字符的类  SpringBootBanner  ,现在向调用链上方继续寻找,通过 CTRL + B  或者全局搜索可以发现 SpringBootBanner  在 SpringApplicationBannerPrinter  类中作为类变量,大概能猜测出这个 SpringApplicationBannerPrinter  类是Banner打印的核心控制器。
  2、进入 SpringApplicationBannerPrinter  类,照例先看注释 Class used by SpringApplication to print the application banner.  ,意思是当前类被 SpringApplication  用来打印banner。
  这个  SpringApplication  好像有点眼熟,名字和我们SpringBoot项目的启动类有点相似,翻翻启动类的代码,想起我们就是通过 SpringApplication  的 run  方法启动项目,banner打印调用也是由 SpringApplication  控制的,后续会详细分析。(占坑,后续SpringBoot启动流程也会出一篇博客去探讨一下)
  回归正题,继续从类的属性开始看,根据名字猜测大概含义,留待后续验证:  BANNER_LOCATION_PROPERTY  :Spring配置,大概是banner文件的路径。 BANNER_IMAGE_LOCATION_PROPERTY  :Spring配置,banner图片的路径(存疑,控制台难道能打印图片?)。 DEFAULT_BANNER_LOCATION = "banner.txt"  :取值是txt文件,猜测是banner文件的默认位置。 String[] IMAGE_EXTENSION = { "gif", "jpg", "png" }  :取值是常见图片的后缀,结合第二个属性猜测是用来对banner图片类型做限制。 DEFAULT_BANNER = new SpringBootBanner()  :把上节分析的 SpringBootBanner  当做Banner默认实现类 ResourceLoader resourceLoader  : ResourceLoader  简单来说是Spring加载资源的统一抽象,由实现类提供具体逻辑。
  在Spring中读取xml配置文件加载应用上下文的 ClassPathXmlApplicationContext  ,就是 ResourceLoader  的子类。 Banner fallbackBanner  :翻译过来是 回退banner  ,暂时猜不出作用,等待后续填坑。
  3、往下看方法,只有两个非私有方法,都是  print  的重载方法,差别在于第三个参数,分别是 Log logger  和 PrintStream out  ,代表这两个方法分别负责日志打印和控制台打印。
  紧扣主题,先看负责控制台打印的方法。  	Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {		Banner banner = getBanner(environment);		banner.printBanner(environment, sourceClass, out);		return new PrintedBanner(banner, sourceClass);	}
  代码很精简,第一行获取  Banner  类,第二行调用 Banner  的 print  方法打印banner图案,最后生成 PrintedBanner  并返回。
  1. getBanner  getBanner源码
  查看  getBanner  方法,首先创建 Banners  ,底层就是 Banner  数组,由于存在控制台、日志两种打印方式,使用此类方便批量处理。 Banners源码
  接着就是调用  getImageBanner  和 getTextBanner  方法获取Banner,如果 Banner  数组不为空则返回,否则检查 fallbackBanner  。
  这个  fallbackBanner  光看名字看不出是什么,使用 CTRL+B  查看引用,发现是在 SpringApplication#printBanner  里注入进来的,如下图。
  继续查找  this.banner  会发现,最终 Banner  只能通过 SpringApplicationBuilder#banner  注入。
  SpringApplicationBuilder  是通过Constructor(构造器)模式实现的 SpringApplication  构造器。
  查看 banner  方法的注释,我们可以知道这里注入的 Banner  实例会在 没有静态banner文件时使用 。
  回过头来, fallbackBanner  的坑填上了,它是在 SpringApplicationBannerPrinter  找不到txt文件或者图片作为banner素材的时候使用。
  如果  fallbackBanner  也为空,则最终返回兜底方案- SpringBootBanner  。
  getBanner  的结构分析完了,实际情况我们知道走的是兜底方案,也就是只要我们能让 getImageBanner  、 getTextBanner  或者 fallbackBanner  不为空,就能改变banner打印的图案。
  带着这个想法,我们就去看看 getImageBanner  和 getTextBanner  是咋回事。
  2、getImageBanner
  查看源码,首先  environment.getProperty  读取配置 spring.banner.image.location  获取图片位置。
  配置文件读取若为空则遍历图片后缀数组  IMAGE_EXTENSION  ,采用 "banner." + ext  拼接方式得到图片相对路径,并尝试加载。加载成功后会生成 ImageBanner  并返回。
  接收图片资源并处理打印的逻辑都封装在  ImageBanner  中,后续单独写一篇文章尝试分析图片打印逻辑。
  按照我们的分析,只要在配置文件中添加  spring.banner.image.location  并赋值正确的图片路径,或者在resources目录下存放一张名字为"banner"、后缀是 gif,jpg, png  其中之一的图片, SpringApplicationBannerPrinter  就会打印出来。
  注:  为什么没加前缀 classpath:  也可以放在resources目录下,可以查看 DefaultResourceLoader#getResource  对于 banner.jpg  这种location的处理逻辑。
  后续章节会有打印效果。  getImageBanner源码
  3、getTextBanner
  查看源码,同样是先从配置文件中读取banner文件的location并尝试加载资源,和  getImageBanner  不同的是,这里读取不到会使用默认值 banner.txt  。
  加载资源后有一个  Resource  的限制条件 !resource.getURL().toExternalForm().contains("liquibase-core")  ,这里不明白这个条件的含义,只查询到了 Liquibase  是一个用于跟踪、管理和应用数据库变化的开源工具。
  资源校验通过后生成  ResourceBanner  并返回。 getTextBanner源码
  接下来进入  ResourceBanner  看下打印细节。
  printBanner  结构比较简单,第一部分设置banner字符集,优先读取配置 spring.banner.charset  ,无配置则默认设置为 UTF-8  。
  第二部分去解析banner字符,比如将 ${xxx}  占位符解析成实际的值。
  第三部分就是调用流打印输出。 ResourceBanner#printBannerbanner打印调用方-SpringApplication
  上节看完  SpringApplicationBannerPrinter  ,这节来寻找打印banner的调用方。
  CTRL+B  查看 SpringApplicationBannerPrinter#print  的引用,定位到了 SpringApplication#printBanner  。源码如下。
  从整体结构来看,  printBanner  方法根据 this.bannerMode  取值不同,执行不同的打印策略:不打印、打印到日志、打印到控制台。 那么这个bannerMode 是怎么设置的?查看初始化的代码,默认值是CONSOLE 。
  继续寻找,最终定位到了SpringApplicationBuilder#bannerMode ,意味着bannerMode 只能通过构造器进行注入。
  继续寻找  printBanner  的调用方,定位到了 SpringApplication#run(String...)  。
  上面有提到过,通常我们SpringBoot项目都是去调用  SpringApplication#run(Class<?>, String...)  去启动项目,底层是通过 new  关键字创建 SpringApplication  对象,最后调用 SpringApplication#run(String...)  完成一系列的资源初始化。
  所以这就可以解释大多数情况下,我们的SpringBoot项目启动时都会打印那个默认的"Spring"字符。  SpringApplication#printBanner源码
  如何修改项目启动的banner修改banner打印策略
  经上分析,banner打印策略包括  控制台  、  日志  、  不打印  。
  1. 隐式
  默认策略是  控制台  ,只需大多数情况一样,项目启动类通过 SpringApplication.run(DistinctAppUserServiceApplication.class, args);  启动,无需指定。
  2. 显式注入
  通过  SpringApplicationBuilder  构造器显式注入banner打印策略。 @SpringBootApplicationpublic class DemoApplication {    public static void main(String[] args) {        new SpringApplicationBuilder(DemoApplication.class)		// Banner.Mode.LOG 打印到日志		// Banner.Mode.OFF 不打印                .bannerMode(Banner.Mode.CONSOLE)                .run(args);    }}
  打印效果
  打印到控制台
  打印到日志:  INFO  级别
  修改banner内容文本
  方式一:在  src/main/resources  下新建 banner.txt  ,里面放入想要打印的内容即可。
  方式二:修改配置文件  spring:  banner:    location: file/bannerText.txt #文件位置 src/main/resources/file/bannerText.txt图片
  和文本方式相同,但是图片类型有限制,只能是以下三种  gif,、jpg、png  。
  方式一:在 src/main/resources  下新建 banner.png  ,里面放入想要打印的内容即可。
  方式二:修改配置文件  spring:  banner:    image:      location: file/bannerImage.png #文件位置 src/main/resources/file/bannerImage.png
  打印效果

人类进入太空是否安全?国际空间站的实验揭示未来太空飞行的风险一个国际科学家小组在国际空间站上进行了一项长期实验,研究空间辐射对小鼠胚胎干细胞的影响。他们的研究将帮助科学家对未来人类太空飞行的空间辐射的风险和安全性做出更准确的评估。该团队最近2022年最值得期待的MMA女子对决奥运摔跤冠军哈里森VS机械婆凯拉哈里森(KaylaHarrison)和机械婆克里斯赛博格(CrisCyborg)目前还没有机会对决。但他们无情的垃圾对喷,使他们成为2022年最有看点的竞争对手之一。克里斯赛博Nat。Synth。非范德华结构的机械剥离2022年11月14日,Nat。Synth。在线发表了苏州大学耿凤霞教授课题组的研究论文,题目为MechanicalcleavageofnonvanderWaalsstructur第一次发射宇宙空间站什么样的?跟着空间站一起遨游宇宙距离地面上约400公里的高空,国际空间站正以每小时7。7公里的速度飞行。NASA和欧洲航天局easa发布的照片和视频显示着它们在各个地方拍摄的宇宙。在东亚上空拍摄的照片显示,在地球第三次出舱活动全部既定任务圆满完成神舟十四号航天员实现首次跨舱段舱外行走原标题第三次出舱活动全部既定任务圆满完成神舟十四号航天员实现首次跨舱段舱外行走记者廉颖婷据中国载人航天工程办公室消息,17日16时50分,经过约5。5小时的出舱活动,神舟十四号航天亚洲杯结束男单世界排名更新,马龙和王楚钦排名下滑,张本创纪录亚洲杯结束男单世界排名更新,马龙和王楚钦排名下滑,张本创纪录!一起来关注一下国乒的最新消息,在全锦赛之后最受球迷关注的乒乓球亚洲杯经过三个比赛日的精彩比拼已经正式落下了帷幕,在男单dotnetbarUI和DevExpress做个拿来即用的脚手架项目这两篇文章着重介绍下winform这块的技术应用不学习,不做笔记就忘了疫情如果一隔离更是忘得没影了下面那分别用dotnetbar和devExpress来做个脚手架项目,拿来即可用哦新机三星推出原神联名版礼盒联动甘雨这波打几分?据IT之家报道,近日韩国游戏展GSTAR2022在釜山举办,有海外网友(gensanjyu)在活动现场拍到一组三星原神联动的产品。如上图所见,三星GalaxyZFold4三星Bud漫评雅万高铁牵手中印尼跑出合作共赢加速度11月16日,正在建设的印尼雅万高铁试验段正式测试运行,并取得圆满成功。作为印尼和东南亚第一条高铁,一带一路倡议的重大标志性项目,雅万高铁见证了中印尼心手相牵的深情厚谊,跑出了两国NASA猎户座飞船超出预期,将于11月21日到达月球IT之家11月20日消息,北京时间11月16日14时47分,NASA太空发射系统(SLS)携带猎户座飞船发射升空。此次任务称之为阿尔忒弥斯1号,这是一次无人绕月飞行测试任务,为后续我当初究竟在想什么,才会选择当天文学家在普通人的脑海中,天文学家几乎等同于星空的守望者,隔三岔五就会跑到望远镜前。一旦有令人振奋的新鲜事物出现在天幕中,比如垂死爆发的恒星或初次造访的彗星,他们就会立马举起一台大大的侦察
魔力宝贝手游魔力宝贝复古魔力童年回忆再遇法兰城大家好我是凡凡,今天给大家介绍一款经典情怀游戏魔力宝贝手游,这款手游在最近也是非常的火热,有很多玩家都体验过了,接下来凡凡给大家介绍一下这款游戏。进游戏玩家可以根据自己喜好,选择人王者荣耀英雄人物原型系列之2妲己妲己相信我们大家都是比较熟悉的了,但是很多单纯玩王者荣耀的朋友对历史上真正的妲己是怎么样的并不是很清楚,今天我们就一起来认识一下吧。王者荣耀里面的妲己请尽情吩咐妲己,主人。羁绊是什千年盛世背景故事大家好,我是千年手游君临,今天继续为大家带来优质千年手游日常,如果我们要玩一款游戏肯定要先知道它的背景故事,一个游戏光有玩法,没有一个好的故事线,游戏是没有灵魂的,也是吸引不了玩家失眠多是肝火旺,建议多吃这3个菜,养肝下火,有助于睡眠失眠多是肝火旺,建议多吃这3个菜,养肝下火,有助于睡眠晚上睡不着是真的难受,辗转反侧,而且很多人都被睡眠问题困扰着,不仅有害身体健康,而且还影响第二天精神状态。失眠不好的原因,其实改变你的饮食,将改变你的生活!当我们提到改变饮食习惯时,大多数人的第一反应可能是失去几磅,或者追求一个更好的身材。然而,饮食的重要性远远不止于此,因为它直接影响到我们身体和大脑的健康,甚至可以改变我们的情绪和幸激光祛痣到底能不能做?痣,又名黑痣黑子黡子血痣等,中国古代早在几千年前就对痣有了一定认识,现代医学证明,某些痣属于癌前病变,影响人体健康,同时痣也越来越影响人们的审美。现代临床医学通常认为痣的形成与人们这么安排一天的饮食只会越来越瘦均衡饮食对于保持身体健康和预防慢性病至关重要。重要的是要知道每顿饭吃什么食物,吃多少,以及这样做的好处。在这篇文章中,我们将在不引用现有论文的情况下,提供关于每顿饭吃什么每种食物应消除富贵包,三步养成好体态!天气一开始变暖,掩藏在冬季厚重羽绒服里的体态问题就开始显现,含胸驼背,脖颈前倾等体态问题,不仅会让人看起来没精神,还有可能引发富贵包等身体问题。富贵包多是由于不良的习惯引发的,人长湿气不去百病来,中医参苓白术丸巧搭配,散尽一身湿气大家好,我是刘医生。你知道吗?其实人身上很多的疾病都是因为湿气太重而引起的。大家常用的祛湿的中成药是参苓白术丸,但是有些患者觉得用了以后效果一般,其实参苓白术丸主要是健脾祛湿的药,泡脚,泡到大汗淋漓?这么多年,你可能都做错了虽然春天已经来了,但是伴随一轮又一轮的寒潮,很多朋友说得最多的还是为什么这么冷。怕冷到底是哪里出了问题呢?怕冷到底是哪儿出了问题?中医认为怕冷有很多原因,其中最主要的原因就是阳虚。王天一特大荣获象甲最佳棋手,许久未出场的郑特大也现身颁奖典礼昨日2022象甲常规赛落下帷幕,进入常规赛颁奖环节。王特大不负众望拿下最有价值旗手。王特大所在队伍拿下常规赛冠军。许久未出场比赛的郑特大也现身颁奖典礼。附王天一于2004年获第十三