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()

猜你喜欢

转载自www.cnblogs.com/lay2017/p/11408537.html