SpringApplication setBanner无效的问题

Posted lay2017

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringApplication setBanner无效的问题相关的知识,希望对你有一定的参考价值。

如下两个代码片段:

片段1

1 SpringApplication application = new SpringApplication(SpringBootLearnApplication.class);
2 application.setBanner((environment, sourceClass, out) -> System.out.println("测试banner的设置"));
3 application.run(args);

片段2

1 SpringApplication application = new SpringApplication();
2 application.setBanner((environment, sourceClass, out) -> System.out.println("测试banner的设置"));
3 application.run(SpringBootLearnApplication.class, args);

两个代码片段的区别在于是在SpringApplication构造方法里面传入,亦或者在run这个方法中传入。

如片段2的做法,在run方法传入,SpringBootLearnApplication.class这个类,会导致setBanner完全等同于失效。

我们点开片段1的run方法:

技术图片

可以看到该run方法进入的是SpringApplication的成员方法,也就是说我们实例化了该SpringApplication,并且调用了该实例的run方法。

我们再点开片段2的run方法:

技术图片

和片段1很明显的区别,该run方法是一个静态的。并且在方法内部又new了一次SpringApplication并调用该方法的run。

所以,片段2实际上创建了两个SpringApplication的实例,setBanner方法只是对自己实例化的SpringApplication实例进行设置,从而导致setBanner最后没有任何效果。

我们可以采用片段1中的写法,就不会出现两次实例化

1 SpringApplication application = new SpringApplication(SpringBootLearnApplication.class);
2 application.setBanner((environment, sourceClass, out) -> System.out.println("测试banner的设置"));
3 application.run(args);

或者,如果完全不需要设置任何东西,就直接默认简写

1 SpringApplication.run(SpringBootLearnApplication.class, args);

不论如何最终都将按照这样的顺序执行new SpringApplication() --> run()

 

以上是关于SpringApplication setBanner无效的问题的主要内容,如果未能解决你的问题,请参考以下文章

SpringApplication理解

springboot情操陶冶-SpringApplication

SpringBoot—启动原理之SpringApplication对象的创建

SpringApplication.run 主方法

Spring Boot深入原理 - SpringApplication启动原理

使用 SpringApplication 时加载 applicationcontext.xml