溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot的自動(dòng)配置、Command-line Runner

發(fā)布時(shí)間:2020-05-25 20:25:00 來(lái)源:網(wǎng)絡(luò) 閱讀:307 作者:沙漏半杯 欄目:編程語(yǔ)言

接下來(lái)關(guān)于SpringBoot的一系列文章和例子,都來(lái)自《Spring Boot Cookbook》這本書,本文的主要內(nèi)容是start.spring.io的使用、Spring Boot的自動(dòng)配置以及CommandRunner的角色和應(yīng)用場(chǎng)景。

1. start.spring.io的使用

首先帶你瀏覽http://start.spring.io/,在這個(gè)網(wǎng)址中有一些Spring Boot提供的組件,然后會(huì)給你展示如何讓你的Spring工程變得“Bootiful”,我稱之為“Boot化”。

在網(wǎng)站Spring Initializr上填對(duì)應(yīng)的表單,描述Spring Boot項(xiàng)目的主要信息,例如Project Metadata、Dependency等。在Project Dependencies區(qū)域,你可以根據(jù)應(yīng)用程序的功能需要選擇相應(yīng)的starter。

Spring Boot starters可以簡(jiǎn)化Spring項(xiàng)目的庫(kù)依賴管理,將某一特定功能所需要的依賴庫(kù)都整合在一起,就形成一個(gè)starter,例如:連接數(shù)據(jù)庫(kù)、springmvc、spring測(cè)試框架等等。簡(jiǎn)單來(lái)說(shuō),spring boot使得你的pom文件從此變得很清爽且易于管理。

常用的starter以及用處可以列舉如下:

  • spring-boot-starter: 這是核心Spring Boot starter,提供了大部分基礎(chǔ)功能,其他starter都依賴于它,因此沒(méi)有必要顯式定義它。

  • spring-boot-starter-actuator:主要提供監(jiān)控、管理和審查應(yīng)用程序的功能。

  • spring-boot-starter-jdbc:該starter提供對(duì)JDBC操作的支持,包括連接數(shù)據(jù)庫(kù)、操作數(shù)據(jù)庫(kù),以及管理數(shù)據(jù)庫(kù)連接等等。

  • spring-boot-starter-data-jpa:JPA starter提供使用Java Persistence API(例如Hibernate等)的依賴庫(kù)。

  • spring-boot-starter-data-*:提供對(duì)MongoDB、Data-Rest或者Solr的支持。

  • spring-boot-starter-security:提供所有Spring-security的依賴庫(kù)。

  • spring-boot-starter-test:這個(gè)starter包括了spring-test依賴以及其他測(cè)試框架,例如JUnit和Mockito等等。

  • spring-boot-starter-web:該starter包括web應(yīng)用程序的依賴庫(kù)。

How do

首先我們要通過(guò)start.spring.io創(chuàng)建一個(gè)圖書目錄管理程序,它會(huì)記錄出版圖書的記錄,包括作者、審閱人、出版社等等。我們將這個(gè)項(xiàng)目命名為BookPub,具體的操作步驟如下:

  • 點(diǎn)擊“Switch to the full version.”,展示完整頁(yè)面;

  • Group設(shè)置為:org.test;

  • Artifact設(shè)置為:bookpub;

  • Name設(shè)置為:BookPub;

  • Package Name設(shè)置為:org.test.bookpub;

  • Packaging代表打包方式,我們選jar;

  • Spring Boot Version選擇最新的1.3.0;

  • 創(chuàng)建Maven工程,當(dāng)然,對(duì)Gradle比較熟悉的同學(xué)可以選擇Gradle工程。

  • 點(diǎn)擊“Generate Project”下載工程包。

利用IDEA導(dǎo)入下載的工程,可以看到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>

2. Spring Boot的自動(dòng)配置

在Spring Boot項(xiàng)目中,xxxApplication.java會(huì)作為應(yīng)用程序的入口,負(fù)責(zé)程序啟動(dòng)以及一些基礎(chǔ)性的工作。@SpringBootApplication是這個(gè)注解是該應(yīng)用程序入口的標(biāo)志,然后有熟悉的main函數(shù),通過(guò)SpringApplication.run(xxxApplication.class, args)來(lái)運(yùn)行Spring Boot應(yīng)用。打開SpringBootApplication注解可以發(fā)現(xiàn),它是由其他幾個(gè)類組合而成的:@Configuration(等同于spring中的xml配置文件,使用Java文件做配置可以檢查類型安全)、@EnableAutoConfiguration(自動(dòng)配置,稍后細(xì)講)、@ComponentScan(組件掃描,大家非常熟悉的,可以自動(dòng)發(fā)現(xiàn)和裝配一些Bean)。

我們?cè)趐om文件里可以看到,com.h3database這個(gè)庫(kù)起作用的范圍是runtime,也就是說(shuō),當(dāng)應(yīng)用程序啟動(dòng)時(shí),如果Spring Boot在classpath下檢測(cè)到org.h3.Driver的存在,會(huì)自動(dòng)配置H2數(shù)據(jù)庫(kù)連接?,F(xiàn)在啟動(dòng)應(yīng)用程序來(lái)觀察,以驗(yàn)證我們的想法。打開shell,進(jìn)入項(xiàng)目文件夾,利用mvn spring-boot:run啟動(dòng)應(yīng)用程序,如下圖所示。

[圖片上傳失敗...(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將自動(dòng)創(chuàng)建JPA容器,并使用Hibernate4.3.11,使用H2Dialect管理H2數(shù)據(jù)庫(kù)(內(nèi)存數(shù)據(jù)庫(kù))。

3. 使用Command-line runners

我們新建一個(gè)StartupRunner類,該類實(shí)現(xiàn)CommandLineRunner接口,這個(gè)接口只有一個(gè)函數(shù):public void run(String... args),最重要的是:這個(gè)方法會(huì)在應(yīng)用程序啟動(dòng)后首先被調(diào)用。

How do

  • 在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類中創(chuàng)建bean對(duì)象,代碼如下:

????@Bean
????public?StartupRunner?schedulerRunner()?{????????return?new?StartupRunner();
????}

還是用mvn spring-boot:run命令啟動(dòng)程序,可以看到hello的輸出。對(duì)于那種只需要在應(yīng)用程序啟動(dòng)時(shí)執(zhí)行一次的任務(wù),非常適合利用Command line runners來(lái)完成。Spring Boot應(yīng)用程序在啟動(dòng)后,會(huì)遍歷CommandLineRunner接口的實(shí)例并運(yùn)行它們的run方法。也可以利用@Order注解(或者實(shí)現(xiàn)Order接口)來(lái)規(guī)定所有CommandLineRunner實(shí)例的運(yùn)行順序。

利用command-line runner的這個(gè)特性,再配合依賴注入,可以在應(yīng)用程序啟動(dòng)時(shí)后首先引入一些依賴bean,例如data source、rpc服務(wù)或者其他模塊等等,這些對(duì)象的初始化可以放在run方法中。不過(guò),需要注意的是,在run方法中執(zhí)行初始化動(dòng)作的時(shí)候一旦遇到任何異常,都會(huì)使得應(yīng)用程序停止運(yùn)行,因此最好利用try/catch語(yǔ)句處理可能遇到的異常。

最后給你們推薦一個(gè)群,如果你還想提升自己

歡迎加入Java技術(shù)交流群:659270626

本群提供免費(fèi)的學(xué)習(xí)指導(dǎo) 提供Spring源碼、MyBatis、Netty、Redis,Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx、分布式、高并發(fā)、性能調(diào)優(yōu)、等架構(gòu)技術(shù)架構(gòu)資料 以及免費(fèi)的解答

不懂的問(wèn)題都可以在本群提出來(lái) 之后還會(huì)有職業(yè)生涯規(guī)劃以及面試指導(dǎo)?


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI