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

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
  打印效果

双十一好机推荐!新iPhone14亲身体验高颜值高性能再上黑科技哈喽,您好!我是原呵呵,点点关注吧,更多精彩内容等着您新的iPhone14终于到货了。这一次,我正在盘点新的iPhone14,但请注意,具有相同规格但尺寸更大的iPhone14Pl父母的爱,是孩子一生用不尽的资源两年前,在苏州留园游览时,碰上一个三四岁模样的小男孩正在哭闹,孩子自己不愿走路,要爸爸妈妈抱,哭着哭着就坐在地上了。傍边还有一位奶奶或外婆样的年长者。这时候,三十来岁的年轻妈妈说赶贷款上班李梓萌低头念稿反被赞,45岁仍未婚荣登光棍榜榜首倪萍嘴瓢的李梓萌在贷款上班在央视嘴瓢是要付出代价的。倪萍曾在节目中吐槽李梓萌新闻部有个规定,错一个字扣两百,你想啊,这李梓萌上完联播,上晚间新闻,天天播天天播,按照我这个四舍五入的相恋30年,结婚4次,张智霖宠妻人设彻底崩塌谁能想到披哥2最先翻车的会是张智霖!!!在节目里,哥哥张智霖与同组的张云龙范世琦Mike合唱无与伦比的美丽。明明是竞演舞台,硬生生被张智霖玩成了婚礼现场。我记得我曾经说过,我希望在当前四款海贼手游各自的优质程度,平民可入坑哪些?诸君安好,雾夏菌报道。当前国服有4款海贼手游,分别是启航强者之路燃烧意志热血航线,那它们各自的优质程度,也就是氪金程度如何?1启航在江湖上流传着这么一句话倾家荡产勉强启航。嗯这话说重庆主城啥时间能一小时上金佛山?重庆人都知道南川是重庆的生态后花园,有金佛山国家级风景名胜区神龙峡风景区山王坪国家喀斯特公园黎香湖国家湿地公园等等。那么啥时间能一小时上金佛山?这就是南川正在推进的同城化发展先行区东南亚航线持续增加中,一起共赴自由之旅新开国际航线上海曼谷南昌泰国的夏天永不停歇在这个秋季和春秋航空一起共赴自由之旅用手机镜头记录每个精彩瞬间吧本期推荐航线更多航线可关注春秋航空小程序或登陆春秋航空APP查看No。1曼陈燕华32岁嫁大学教授,34岁和丈夫去国外,事业家庭两不误陈燕华的人生,大致可分为三个阶段。第一阶段,是在电视机里给小朋友讲故事。那是上世纪八十年代。在上海电视台,陈燕华有一档固定的电视节目。节目还是以自己的名字命名的燕子姐姐讲故事。在电春去秋来四季轮回,来看看我国南北方入秋时间的早晚差异地球自转的轨道面赤道平面和地球公转的轨道面黄道平面存在着夹角,也就是黄赤交角,目前黄赤交角的度数大约为23。5。由于黄赤交角的存在,使得在地球公转的过程中,太阳直射点会在南北回归线今生,遇见你,是何其幸运?渺渺红尘,知己难寻人生若得一知己,足以慰风尘若得一位红颜知己,人生无憾?今生,遇见你,是何其幸运?昨天她说能做我的红颜知己。虽然我一直对她有无限的向往和遐想,但我却从不敢有什么真实黄文秀是个爱提建议的课代表头条创作挑战赛一个阳光暖暖的冬日,黄文秀和几个关系要好的女同学在校园的草地上晒太阳,看书。青春年少的初中生,正是爱做梦的年纪。她们躺在草坪上,仰望着校园上空湛蓝而开阔的天空,目光放
广东福建甘肃海南2022养老金调整情况概述现在给大家简明扼要地说一下广东1。普涨28元原养老金的2。12。缴费年限,每满一年1元(不足15发15)超过20年,每满一年额外1元3。年龄倾斜,满70周岁,不满8020满80周岁二胎产子就发现老公现身会所,这么隐忍只因为向家的黑白往事就在刚刚,网上爆出了向佐疑似出轨的消息,迅速登上了热搜。随即向太的否认就立马来了,众所周知,向家是只有向太一人有发言权的,从公布婚讯到怀孕生子到澄清绯闻,统统一个向太出马。向佐这次漫画科普关于性知识,建议父母从小抓起,不要不放在心上其实,我们每一个人都是从青春期成长过来的,而且对于每个人来说,青春期真的是非常的重要,正确地认识和了解性方面的知识,会对我们的身体有很大的好处,会避免出现身体受损的现象发生。就好像前列腺癌发现即晚期?提醒男性2大症状出现,可能癌症来临前列腺癌只有晚期才能被发现?65岁的郭先生最近出现了尿急尿频的症状,腰椎也总是疼痛。去往医院检查之后,结果显示他患上了前列腺癌,并且已经到了晚期。郭先生感到十分震惊,他认为自己平时1989年,农村一老汉频繁丢猪,无奈报警,专家赶到后却乐开了花猪作为农民主要喂养的牲畜之一,他不仅能吃,最重要的是能够补贴家用,也是老百姓的主要收入来源之一,直至现在,一部分农村家庭的收入也会有一部分来源于养猪。在1989年,那时候相对来说还西媒科学素食有助改善地球环境据西班牙阿贝赛报网站7月11日报道,营养学家帮助我们揭穿了有关素食主义的一些迷思和误解,这些认知都源于错误的信息或无知。在饮食结构中避免食用肉类和其他动物产品早已不是什么新鲜事。正直肠癌早期症状是什么?直肠癌的临床表现直肠癌早期无明显症状,或仅有少量便血,常不引起患者的重视,待癌肿破溃形成溃疡或感染时才出现症状。早期多无明显症状,仅有少量的便血和便中夹带有黏液及大便习惯的改变。晚被癌症盯上的人,手脚容易冰凉?手脚出现3种症状,或是癌症信号苏女士今年28岁,本来正是身体素质处于巅峰的年龄,可她的身体却出现了异常。苏女士常年都感觉自己的手脚冰凉,即使在炎热的夏天也是如此,冬天的症状更是会加重许多。由于仅仅出现了手脚冰凉李贺我爸是李双江,我弟是李天一,我在没有父爱的环境中成长李贺我爸是李双江,我弟是李天一,我在没有父爱的环境中成长2013年,李双江的小儿子李天一被判十年。他的母亲梦鸽,一夜之间黑发变白发。他的父亲李双江比肉眼看起来老多了。看到父亲如此伤家属注意!有这些症状的精神病人最适合手术治疗原创文章,盗用必究随着现代社会生活与工作节奏加快,精神疾病的发病率呈逐年升高的趋势。精神疾病患者由于思维情感精神行为出现障碍,经常出现行为失控等一系列异常症状,尤其是具有攻击行为的泰国为何要向美国追讨柬埔寨文物?近期,每当有文物归还给泰国时,顿时刷屏泰国各大媒体。这场文物追讨的工作,泰国政府引领,现在连媒体学者也纷纷参与。但有意思的是,追讨回来的很多亮眼文物都是柬埔寨风,或者说古高棉的遗产