SpringApplication類提供了一種快捷方式來啓動java程序,能夠從main()方法啓動Spring應用。有沒有以爲很簡單,很方便。html
接下來將帶你學習一些其餘的一些關於SpringApplication東東java
SpringApplication類提供了一種快捷方式,用於從main()
方法啓動Spring應用。多數狀況下,你只須要將該任務委託給SpringApplication.run
靜態方法:git
public static void main(String[] args){ SpringApplication.run(MySpringConfiguration.class, args); }
當應用啓動時,你應該會看到相似下面的東西:github
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: v2.0.5.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] ationConfigServletWebServerApplicationContext : Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@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.TomcatServletWebServerFactory : 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)
默認狀況下,會顯示INFO日誌消息,包括一些相關的啓動細節,好比啓動應用程序的用戶。若是您須要一個除INFO之外的日誌級別,您能夠設置它,如第264節所述,「日誌級別」,web
若是你想修改spring log的默認級別能夠在application.properties spring
logging.level.root=WARN logging.level.org.springframework.web=DEBUG logging.level.org.hibernate=ERROR
若是你想看debug信息,你也能夠這樣:編程
java -jar myproject-0.0.1-SNAPSHOT.jar --debug
注意:固然若是全都是debug級別的話,啓動的速度會稍微慢點,由於會線程阻塞住進行log輸出api
經過在classpath下添加一個banner.txt
或設置pring.banner.location
來指定相應的文件能夠改變啓動過程當中打印的banner。若是這個文件有特殊的編碼,你可使用banner.encoding
設置它(默認爲UTF-8)。若是文件不是UTF-8的編碼,您能夠設置spring.banner.charset。除了文本文件,你也能夠添加一個banner.gif
,banner.jpg
或banner.png
圖片,或設置spring.banner.image.location
屬性。圖片會轉換爲字符畫(ASCII art)形式,並在全部文本banner上方顯示。app
在banner.txt中可使用以下佔位符:框架
變量 | 描述 |
---|---|
${application.version} | MANIFEST.MF中聲明的應用版本號,例如Implementation-Version: 1.0 會打印1.0 |
${application.formatted-version} | MANIFEST.MF中聲明的被格式化後的應用版本號(被括號包裹且以v做爲前綴),用於顯示,例如(v1.0 ) |
${spring-boot.version} | 當前Spring Boot的版本號,例如2.0.5.RELEASE |
${spring-boot.formatted-version} | 當前Spring Boot被格式化後的版本號(被括號包裹且以v做爲前綴), 用於顯示,例如(v2.0.5.RELEASE ) |
${Ansi.NAME}(或${AnsiColor.NAME},${AnsiBackground.NAME}, ${AnsiStyle.NAME}) | NAME表明一種ANSI編碼,具體詳情查看AnsiPropertySource |
${application.title} | MANIFEST.MF 中聲明的應用title,例如Implementation-Title: MyApp 會打印MyApp |
注 若是想以編程的方式產生一個banner,可使用SpringBootApplication.setBanner(…)
方法,並實現org.springframework.boot.Banner
接口的printBanner()
方法。
你也可使用spring.main.banner-mode
屬性決定將banner打印到何處,System.out
(console
),配置的logger(log
)或都不輸出(off
)。
打印的banner將註冊成一個名爲springBootBanner
的單例bean。
注 YAML會將off
映射爲false
,若是想在應用中禁用banner,你須要確保off
添加了括號:
spring: main: banner-mode: "off"
若是須要建立一個分層的ApplicationContext
(多個具備父子關係的上下文),或只是喜歡使用流式(fluent)構建API,那你可使用SpringApplicationBuilder。 SpringApplicationBuilder容許你以鏈式方式調用多個方法,包括parent和child方法,這樣就能夠建立多層次結構,例如:
new SpringApplicationBuilder() .sources(Parent.class) .child(Application.class) .bannerMode(Banner.Mode.OFF) .run(args);
除了常見的Spring框架事件,好比ContextRefreshedEvent,SpringApplication
也會發送其餘的application事件。
應用運行時,事件會如下面的次序發送:
在運行開始,但除了監聽器註冊和初始化之外的任何處理以前,會觸發一個ApplicationStartingEvent
。
在Environment將被用於已知的上下文,但在上下文被建立前,會出發一個ApplicationEnvironmentPreparedEvent
。
在refresh開始前,但在bean定義已被加載後,會觸發一個ApplicationPreparedEvent
。
在context被刷新以後,可是在任何應用程序和命令行運行者被調用以前,會出發ApplicationStartedEvent
在任何應用程序和命令行運行程序被調用以後,都會觸發一個ApplicationReadyEvent。它代表應用程序已經準備好服務請求。
若是在啓動時出現異常,則會觸發ApplicationFailedEvent
。
注 一般不須要使用application事件,但知道它們的存在是有用的(在某些場合可能會使用到),好比,在Spring Boot內部會使用事件處理各類任務。
Application Event是經過使用Spring Framework的事件發佈機制發送的。這種機制的一部分確保在任何祖先上下文中向偵聽器發佈給偵聽器的事件也被髮布給偵聽器。所以,若是您的應用程序使用SpringApplication實例的層次結構,偵聽器可能會收到同一類型的應用程序事件的多個實例。
爲了讓您的偵聽器可以區分其上下文的事件和後代上下文的事件,它應該請求注入它的應用程序上下文,而後將注入的上下文與事件的上下文進行比較。經過使用@autowired,能夠經過實現ApplicationContextAware來注入,或者,若是監聽器是bean的話。
注 有些事件其實是在ApplicationContext
建立前觸發的,因此你不能在那些事件(處理類)中經過@Bean
註冊監聽器,只能經過SpringApplication.addListeners(…)
或SpringApplicationBuilder.listeners(…)
方法註冊。若是想讓監聽器自動註冊,而不關心應用的建立方式,你能夠在工程中添加一個META-INF/spring.factories
文件,並使用org.springframework.context.ApplicationListener
做爲key指向那些監聽器,以下:
org.springframework.context.ApplicationListener=com.example.project.MyListener
或者能夠寫在代碼裏:
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication app = new SpringApplication(Application.class); app.addListeners(new ApplicationEnvironmentPreparedEventListener()); app.addListeners(new ApplicationFailedEventListener()); app.run(args); } }
若是須要獲取傳遞給SpringApplication.run(…)
的應用參數,你能夠注入一個org.springframework.boot.ApplicationArguments
類型的bean。ApplicationArguments
接口即提供對原始String[]
參數的訪問,也提供對解析成option
和non-option
參數的訪問:
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 爲咱們提供了一個方法,經過實現接口 CommandLineRunner 來實現。
建立實現接口 CommandLineRunner 的類
@Component public class InitDataRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.err.println("InitDataRunner ...."); } }
若是某些定義的CommandLineRunner
或ApplicationRunner
beans須要以特定的順序調用,你能夠實現org.springframework.core.Ordered
接口或使用org.springframework.core.annotation.Order
註解。
個SpringApplication都向JVM註冊一個關機鉤子,以確保ApplicationContext在出口處優雅地關閉。可使用全部標準的Spring生命週期回調(如一次性的sablebean接口或@pre銷燬註釋)。
此外,bean還能夠實現org.springframework.boot。若是他們但願在springapplication.exit()被調用時返回一個特定的出口代碼,ExitCodeGenerator接口。而後,這個退出碼能夠被傳遞給system.exit(),以做爲狀態碼返回它.
@Component public class MyExitCodeGenerator implements ExitCodeGenerator { @Override public int getExitCode() { System.err.println("----9999------ shutdown--------"); return 999; } }
@RestController public class HelloController { @Autowired private ApplicationContext applicationContext; @GetMapping("/stop") public String stop() { // 加上本身的權限驗證,密碼啊,加密啊,時間啊啊等等 SpringApplication.exit(applicationContext); return "ok"; }
轉載請註明出處:聯盟兔
原文:http://syllabus.lianmengtu.top/