實際應用中,我們會有在項目服務啟動的時候就去加載一些數據或做一些事情這樣的需求。
為了解決這樣的問題,Spring Boot 為我們提供了一個方法,通過實現接口 CommandLineRunner 來實現。
很簡單,只需要一個類就可以,無需其他配置。
創建實現接口 CommandLineRunner 的類
package org.springboot.sample.runner; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; /** * 服務啟動執行 * * @author 單紅宇(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年1月9日 */ @Component public class MyStartupRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作<<<<<<<<<<<<<"); } }
Spring Boot應用程序在啟動后,會遍歷CommandLineRunner接口的實例並運行它們的run方法。也可以利用@Order注解(或者實現Order接口)來規定所有CommandLineRunner實例的運行順序。
如下我們使用@Order 注解來定義執行順序。
package org.springboot.sample.runner; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * 服務啟動執行 * * @author 單紅宇(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年1月9日 */ @Component @Order(value=2) public class MyStartupRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作 11111111 <<<<<<<<<<<<<"); } }
package org.springboot.sample.runner; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * 服務啟動執行 * * @author 單紅宇(365384722) * @myblog http://blog.csdn.net/catoop/ * @create 2016年1月9日 */ @Component @Order(value=1) public class MyStartupRunner2 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println(">>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作 22222222 <<<<<<<<<<<<<"); } }
啟動程序后,控制台輸出結果為:
>>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作 22222222 <<<<<<<<<<<<< >>>>>>>>>>>>>>>服務啟動執行,執行加載數據等操作 11111111 <<<<<<<<<<<<<
根據控制台結果可判斷,@Order 注解的執行優先級是按value值從小到大順序。
http://blog.csdn.net/catoop/article/details/50501710
eclipse中給java應用傳args參數的方法如下:
1、先寫好Java代碼,比如文件名為IntArrqy.java;
2、在工具欄或菜單上點run as下邊有個Run Configuration;
3、在彈出窗口點選第二個標簽arguments;
4、把你想輸入的參數寫在program argumenst就可以了,多個參數使用空格隔開。
完成后點run即可通過運行結果看到參數使用情況了。
23. SpringApplication
The SpringApplication class provides a convenient way to bootstrap a Spring application that will be started from a main() method. In many situations you can just delegate to the static SpringApplication.run method:
public static void main(String[] args) { SpringApplication.run(MySpringConfiguration.class, args); }
When your application starts you should see something similar to the following:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: v1.4.0.RELEASE 2013-07-31 00:08:16.117 INFO 56603 --- [ main] o.s.b.s.app.SampleApplication : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb) 2013-07-31 00:08:16.166 INFO 56603 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy 2014-03-04 13:09:54.912 INFO 41370 --- [ main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080 2014-03-04 13:09:56.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication : Started SampleApplication in 2.992 seconds (JVM running for 3.658)
By default INFO logging messages will be shown, including some relevant startup details such as the user that launched the application.
The banner that is printed on start up can be changed by adding a banner.txt file to your classpath, or by setting banner.location to the location of such a file. If the file has an unusual encoding you can set banner.charset (default is UTF-8). In addition to a text file, you can also add a banner.gif, banner.jpg orbanner.png image file to your classpath, or set a banner.image.location property. Images will be converted into an ASCII art representation and printed above any text banner.
Inside your banner.txt file you can use any of the following placeholders:
Table 23.1. Banner variables
| Variable | Description |
|---|---|
|
|
The version number of your application as declared in |
|
|
The version number of your application as declared in |
|
|
The Spring Boot version that you are using. For example |
|
|
The Spring Boot version that you are using formatted for display (surrounded with brackets and prefixed with |
|
|
Where |
|
|
The title of your application as declared in |
![]() |
| The |
You can also use the spring.main.banner-mode property to determine if the banner has to be printed on System.out (console), using the configured logger (log) or not at all (off).
The printed banner will be registered as a singleton bean under the name springBootBanner.
![]() |
| YAML maps spring:
main: banner-mode: "off" |
If the SpringApplication defaults aren’t to your taste you can instead create a local instance and customize it. For example, to turn off the banner you would write:
public static void main(String[] args) { SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setBannerMode(Banner.Mode.OFF); app.run(args); }
![]() |
| The constructor arguments passed to |
It is also possible to configure the SpringApplication using an application.properties file. See Chapter 24, Externalized Configuration for details.
For a complete list of the configuration options, see the SpringApplication Javadoc.
If you need to build an ApplicationContext hierarchy (multiple contexts with a parent/child relationship), or if you just prefer using a ‘fluent’ builder API, you can use the SpringApplicationBuilder.
The SpringApplicationBuilder allows you to chain together multiple method calls, and includes parent and child methods that allow you to create a hierarchy.
For example:
new SpringApplicationBuilder()
.bannerMode(Banner.Mode.OFF)
.sources(Parent.class) .child(Application.class) .run(args);
![]() |
| There are some restrictions when creating an |
In addition to the usual Spring Framework events, such as ContextRefreshedEvent, a SpringApplication sends some additional application events.
![]() |
| Some events are actually triggered before the If you want those listeners to be registered automatically regardless of the way the application is created you can add a org.springframework.context.ApplicationListener=com.example.project.MyListener |
Application events are sent in the following order, as your application runs:
- An
ApplicationStartedEventis sent at the start of a run, but before any processing except the registration of listeners and initializers. - An
ApplicationEnvironmentPreparedEventis sent when theEnvironmentto be used in the context is known, but before the context is created. - An
ApplicationPreparedEventis sent just before the refresh is started, but after bean definitions have been loaded. - An
ApplicationReadyEventis sent after the refresh and any related callbacks have been processed to indicate the application is ready to service requests. - An
ApplicationFailedEventis sent if there is an exception on startup.
![]() |
| You often won’t need to use application events, but it can be handy to know that they exist. Internally, Spring Boot uses events to handle a variety of tasks. |
A SpringApplication will attempt to create the right type of ApplicationContext on your behalf. By default, an AnnotationConfigApplicationContext orAnnotationConfigEmbeddedWebApplicationContext will be used, depending on whether you are developing a web application or not.
The algorithm used to determine a ‘web environment’ is fairly simplistic (based on the presence of a few classes). You can usesetWebEnvironment(boolean webEnvironment) if you need to override the default.
It is also possible to take complete control of the ApplicationContext type that will be used by calling setApplicationContextClass(…).
![]() |
| It is often desirable to call |
If you need to access the application arguments that were passed to SpringApplication.run(…) you can inject aorg.springframework.boot.ApplicationArguments bean. The ApplicationArguments interface provides access to both the raw String[] arguments as well as parsed option and non-option arguments:
import org.springframework.boot.*
import org.springframework.beans.factory.annotation.* import org.springframework.stereotype.* @Component public class MyBean { @Autowired public MyBean(ApplicationArguments args) { boolean debug = args.containsOption("debug"); List<String> files = args.getNonOptionArgs(); // if run with "--debug logfile.txt" debug=true, files=["logfile.txt"] } }
![]() |
| Spring Boot will also register a |
If you need to run some specific code once the SpringApplication has started, you can implement the ApplicationRunner or CommandLineRunner interfaces. Both interfaces work in the same way and offer a single run method which will be called just before SpringApplication.run(…) completes.
The CommandLineRunner interfaces provides access to application arguments as a simple string array, whereas the ApplicationRunner uses theApplicationArguments interface discussed above.
import org.springframework.boot.*
import org.springframework.stereotype.* @Component public class MyBean implements CommandLineRunner { public void run(String... args) { // Do something... } }
You can additionally implement the org.springframework.core.Ordered interface or use the org.springframework.core.annotation.Order annotation if several CommandLineRunner or ApplicationRunner beans are defined that must be called in a specific order.

Each SpringApplication will register a shutdown hook with the JVM to ensure that the ApplicationContext is closed gracefully on exit. All the standard Spring lifecycle callbacks (such as the DisposableBean interface, or the @PreDestroy annotation) can be used.
In addition, beans may implement the org.springframework.boot.ExitCodeGenerator interface if they wish to return a specific exit code when the application ends.
It is possible to enable admin-related features for the application by specifying the spring.application.admin.enabled property. This exposes theSpringApplicationAdminMXBean on the platform MBeanServer. You could use this feature to administer your Spring Boot application remotely. This could also be useful for any service wrapper implementation.
![]() |
| If you want to know on which HTTP port the application is running, get the property with key |
![]() |
| Take care when enabling this feature as the MBean exposes a method to shutdown the application. |
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html

![[Tip]](/image/aHR0cDovL2RvY3Muc3ByaW5nLmlvL3NwcmluZy1ib290L2RvY3MvY3VycmVudC9yZWZlcmVuY2UvaHRtbC9pbWFnZXMvdGlwLnBuZw==.png)
![[Note]](/image/aHR0cDovL2RvY3Muc3ByaW5nLmlvL3NwcmluZy1ib290L2RvY3MvY3VycmVudC9yZWZlcmVuY2UvaHRtbC9pbWFnZXMvbm90ZS5wbmc=.png)