您好,登錄后才能下訂單哦!
接下來關于SpringBoot的一系列文章和例子,都來自《Spring Boot Cookbook》這本書,本文的主要內容是start.spring.io的使用、Spring Boot的自動配置以及CommandRunner的角色和應用場景。
首先帶你瀏覽http://start.spring.io/,在這個網址中有一些Spring Boot提供的組件,然后會給你展示如何讓你的Spring工程變得“Bootiful”,我稱之為“Boot化”。
在網站Spring Initializr上填對應的表單,描述Spring Boot項目的主要信息,例如Project Metadata、Dependency等。在Project Dependencies區域,你可以根據應用程序的功能需要選擇相應的starter。
Spring Boot starters可以簡化Spring項目的庫依賴管理,將某一特定功能所需要的依賴庫都整合在一起,就形成一個starter,例如:連接數據庫、springmvc、spring測試框架等等。簡單來說,spring boot使得你的pom文件從此變得很清爽且易于管理。
常用的starter以及用處可以列舉如下:
spring-boot-starter: 這是核心Spring Boot starter,提供了大部分基礎功能,其他starter都依賴于它,因此沒有必要顯式定義它。
spring-boot-starter-actuator:主要提供監控、管理和審查應用程序的功能。
spring-boot-starter-jdbc:該starter提供對JDBC操作的支持,包括連接數據庫、操作數據庫,以及管理數據庫連接等等。
spring-boot-starter-data-jpa:JPA starter提供使用Java Persistence API(例如Hibernate等)的依賴庫。
spring-boot-starter-data-*:提供對MongoDB、Data-Rest或者Solr的支持。
spring-boot-starter-security:提供所有Spring-security的依賴庫。
spring-boot-starter-test:這個starter包括了spring-test依賴以及其他測試框架,例如JUnit和Mockito等等。
spring-boot-starter-web:該starter包括web應用程序的依賴庫。
首先我們要通過start.spring.io創建一個圖書目錄管理程序,它會記錄出版圖書的記錄,包括作者、審閱人、出版社等等。我們將這個項目命名為BookPub,具體的操作步驟如下:
點擊“Switch to the full version.”,展示完整頁面;
Group設置為:org.test;
Artifact設置為:bookpub;
Name設置為:BookPub;
Package Name設置為:org.test.bookpub;
Packaging代表打包方式,我們選jar;
Spring Boot Version選擇最新的1.3.0;
創建Maven工程,當然,對Gradle比較熟悉的同學可以選擇Gradle工程。
點擊“Generate Project”下載工程包。
利用IDEA導入下載的工程,可以看到pom文件的主體如下如下所示:
????<groupId>com.test</groupId> ????<artifactId>bookpub</artifactId> ????<version>0.0.1-SNAPSHOT</version> ????<packaging>jar</packaging> ???? ????<name>BookPub</name> ????<description>Demo?project?for?Spring?Boot</description> ????<parent> ????????<groupId>org.springframework.boot</groupId> ????????<artifactId>spring-boot-starter-parent</artifactId> ????????<version>1.3.0.RELEASE</version> ????????<relativePath/>?<!--?lookup?parent?from?repository?--> ????</parent> ????<properties> ????????<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> ????????<java.version>1.8</java.version> ????</properties> ????<dependencies> ????????<dependency> ????????????<groupId>org.springframework.boot</groupId> ????????????<artifactId>spring-boot-starter-data-jpa</artifactId> ????????</dependency> ????????<dependency> ????????????<groupId>org.springframework.boot</groupId> ????????????<artifactId>spring-boot-starter-jdbc</artifactId> ????????</dependency> ????????<dependency> ????????????<groupId>com.h3database</groupId> ????????????<artifactId>h3</artifactId> ????????????<scope>runtime</scope> ????????</dependency> ????????<dependency> ????????????<groupId>org.springframework.boot</groupId> ????????????<artifactId>spring-boot-starter-test</artifactId> ????????????<scope>test</scope> ????????</dependency> ????</dependencies> ???? ????<build> ????????<plugins> ????????????<plugin> ????????????????<groupId>org.springframework.boot</groupId> ????????????????<artifactId>spring-boot-maven-plugin</artifactId> ????????????</plugin> ????????</plugins> ????</build>
在Spring Boot項目中,xxxApplication.java會作為應用程序的入口,負責程序啟動以及一些基礎性的工作。@SpringBootApplication是這個注解是該應用程序入口的標志,然后有熟悉的main函數,通過SpringApplication.run(xxxApplication.class, args)
來運行Spring Boot應用。打開SpringBootApplication注解可以發現,它是由其他幾個類組合而成的:@Configuration(等同于spring中的xml配置文件,使用Java文件做配置可以檢查類型安全)、@EnableAutoConfiguration(自動配置,稍后細講)、@ComponentScan(組件掃描,大家非常熟悉的,可以自動發現和裝配一些Bean)。
我們在pom文件里可以看到,com.h3database這個庫起作用的范圍是runtime,也就是說,當應用程序啟動時,如果Spring Boot在classpath下檢測到org.h3.Driver的存在,會自動配置H2數據庫連接。現在啟動應用程序來觀察,以驗證我們的想法。打開shell,進入項目文件夾,利用mvn spring-boot:run
啟動應用程序,如下圖所示。
[圖片上傳失敗...(image-5c035d-1557557877934)]
可以看到類似Building JPA container EntityManagerFactory for persistence unit 'default、HHH000412: Hibernate Core {4.3.11.Final}、HHH000400: Using dialect: org.hibernate.dialect.H2Dialect這些Info信息;由于我們之前選擇了jdbc和jpa等starters,Spring Boot將自動創建JPA容器,并使用Hibernate4.3.11,使用H2Dialect管理H2數據庫(內存數據庫)。
我們新建一個StartupRunner類,該類實現CommandLineRunner接口,這個接口只有一個函數:public void run(String... args)
,最重要的是:這個方法會在應用程序啟動后首先被調用。
在src/main/java/org/test/bookpub/下建立StartRunner類,代碼如下:
package?com.test.bookpub;import?org.slf4j.Logger;import?org.slf4j.LoggerFactory;import?org.springframework.boot.CommandLineRunner;public?class?StartupRunner?implements?CommandLineRunner?{????protected?final?Logger?logger?=?LoggerFactory.getLogger(StartupRunner.class);????@Override ????public?void?run(String...?strings)?throws?Exception?{ ????????logger.info("hello"); ????} }
在BookPubApplication類中創建bean對象,代碼如下:
????@Bean ????public?StartupRunner?schedulerRunner()?{????????return?new?StartupRunner(); ????}
還是用mvn spring-boot:run
命令啟動程序,可以看到hello的輸出。對于那種只需要在應用程序啟動時執行一次的任務,非常適合利用Command line runners來完成。Spring Boot應用程序在啟動后,會遍歷CommandLineRunner接口的實例并運行它們的run方法。也可以利用@Order注解(或者實現Order接口)來規定所有CommandLineRunner實例的運行順序。
利用command-line runner的這個特性,再配合依賴注入,可以在應用程序啟動時后首先引入一些依賴bean,例如data source、rpc服務或者其他模塊等等,這些對象的初始化可以放在run方法中。不過,需要注意的是,在run方法中執行初始化動作的時候一旦遇到任何異常,都會使得應用程序停止運行,因此最好利用try/catch語句處理可能遇到的異常。
最后給你們推薦一個群,如果你還想提升自己
歡迎加入Java技術交流群:659270626
本群提供免費的學習指導 提供Spring源碼、MyBatis、Netty、Redis,Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx、分布式、高并發、性能調優、等架構技術架構資料 以及免費的解答
不懂的問題都可以在本群提出來 之后還會有職業生涯規劃以及面試指導?
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。