zoukankan      html  css  js  c++  java
  • Springboot banner

    Springboot banner

    Banner的实现类如下:

    • SpringBootBanner:Banner的默认实现类
    • ImageBanner:用来打印图片日志的banner
    • ResourceBanner:资源Banner

    Springboot在启动的时候,默认情况下会打印如下信息

      .   ____          _            __ _ _
     /\ / ___'_ __ _ _(_)_ __  __ _    
    ( ( )\___ | '_ | '_| | '_ / _` |    
     \/  ___)| |_)| | | | | || (_| |  ) ) ) )
      '  |____| .__|_| |_|_| |_\__, | / / / /
     =========|_|==============|___/=/_/_/_/
     :: Spring Boot ::        (v2.2.5.RELEASE)
    

    可以分析源码看看为什么打印如下日志

    SpringApplication中run方法
    
    public ConfigurableApplicationContext run(String... args) {
    			...
    			Banner printedBanner = printBanner(environment);
    			....
    		return context;
    	}
    

    调用printBanner(ConfigurableEnvironment environment)的方法

    private Banner printBanner(ConfigurableEnvironment environment) {
    		if (this.bannerMode == Banner.Mode.OFF) {
    			return null;
    		}
        //获取资源加载
    		ResourceLoader resourceLoader = (this.resourceLoader != null) ? this.resourceLoader
    				: new DefaultResourceLoader(getClassLoader());
        //创建SpringApplicationBannerPrinter对象
    		SpringApplicationBannerPrinter bannerPrinter = new SpringApplicationBannerPrinter(resourceLoader, this.banner);
    		if (this.bannerMode == Mode.LOG) {
    			return bannerPrinter.print(environment, this.mainApplicationClass, logger);
    		}
        //打印日志
    		return bannerPrinter.print(environment, this.mainApplicationClass, System.out);
    	}
    
    Banner print(Environment environment, Class<?> sourceClass, PrintStream out) {
        	//获取Banner
    		Banner banner = getBanner(environment);
        	//打印Banner
    		banner.printBanner(environment, sourceClass, out);
    		return new PrintedBanner(banner, sourceClass);
    	}
    

    getBanner(Environment environment)方法

    private Banner getBanner(Environment environment) {
    	Banners banners = new Banners();
        //添加ImageBanner
    	banners.addIfNotNull(getImageBanner(environment));
        //添加TextBanner
    	banners.addIfNotNull(getTextBanner(environment));
    	if (banners.hasAtLeastOneBanner()) {
    		return banners;
    	}
    	if (this.fallbackBanner != null) {
    		return this.fallbackBanner;
    	}
    	return DEFAULT_BANNER;
    }
    
    static final String BANNER_IMAGE_LOCATION_PROPERTY = "spring.banner.image.location";
    static final String[] IMAGE_EXTENSION = { "gif", "jpg", "png" };
    private Banner getImageBanner(Environment environment) {
    		String location = environment.getProperty(BANNER_IMAGE_LOCATION_PROPERTY);
    		if (StringUtils.hasLength(location)) {
    			Resource resource = this.resourceLoader.getResource(location);
    			return resource.exists() ? new ImageBanner(resource) : null;
    		}
        //获取banner.gif,banner.jpg,banner.png
    		for (String ext : IMAGE_EXTENSION) {
    			Resource resource = this.resourceLoader.getResource("banner." + ext);
    			if (resource.exists()) {
    				return new ImageBanner(resource);
    			}
    		}
    		return null;
    	}
    
    	static final String BANNER_LOCATION_PROPERTY = "spring.banner.location";
    	static final String DEFAULT_BANNER_LOCATION = "banner.txt";
    private Banner getTextBanner(Environment environment) {
        //获取路径下的banner.txt;
    		String location = environment.getProperty(BANNER_LOCATION_PROPERTY, DEFAULT_BANNER_LOCATION);
    		Resource resource = this.resourceLoader.getResource(location);
    		if (resource.exists()) {
    			return new ResourceBanner(resource);
    		}
    		return null;
    	}
    

    通过上面的代码可以知道,如果在classpath路径下面添加了banner.txt,banner.jpg文件后,首先加载banner.jpg,然后加载banner.txt文件,后面都会打印出来。

    下面通实现自己的Banner

    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            //SpringApplication.run(Application.class,args);
        
            SpringApplication application=new SpringApplication(Application.class);
            //关闭banner
           // application.setBannerMode(Banner.Mode.OFF);
            application.setBanner(new Mybanner());
            application.run(args);
    
    //        SpringApplicationBuilder applicationBuilder=new SpringApplicationBuilder();
    //        //applicationBuilder.profiles("");
    //        applicationBuilder.bannerMode(Banner.Mode.OFF).run(args);
    
        }
    
    }
    
    public class Mybanner implements Banner {
    
        private static final String BANNER = "Spring Mybanner";
        @Override
        public void printBanner(Environment environment, Class<?> sourceClass, PrintStream out) {
        
            System.out.println(BANNER);
        }
    
    }
    

    相关源码:https://github.com/albert-liu435/rookies-springboot

  • 相关阅读:
    【Python应用:基于PyQt5文本识别】调用百度AI对一张或多张图片、文件夹中的图片和屏幕区域截图进行识别(PDF转Word 小意思)
    【Ubuntu搭建Django编程环境】:创建python虚拟开发环境和配置pip国内镜像源
    23种设计模式上篇
    荷兰国旗问题
    文件复制多份
    mybatis批量更新
    数组小和
    常见排序算法
    福尔摩斯的约会
    小明上学
  • 原文地址:https://www.cnblogs.com/haizhilangzi/p/12443824.html
Copyright © 2011-2022 走看看