1. 程式人生 > 其它 >SpringBoot從零建立和配置

SpringBoot從零建立和配置

現在專案基本都是使用的SpringBoot,但是為什麼選擇SpringBoot以及SpringBoot的優勢是什麼?這篇檔案就介紹一下怎麼建立一個SpringBoot。首先了解SpringBoot先去官網https://spring.io/projects/spring-boot 檢視SpringBoot的介紹。

我們主要看一下紅框中的介紹,Spring Boot 可以輕鬆建立基於 Spring 的應用程式,你只需要直接執行就可以。所以Spring Boot就是為了讓我們更加方便的使用Spring。

1.SpringBoot特性

我們先了解一下SpringBoot的4大特性,然後帶著這4個特性去建立一個SpringBoot

  • SpringBoot Starter:他將常用的依賴分組進行了整合,將其合併到一個依賴中,這樣就可以一次性新增到專案的Maven或Gradle構建中;後面我們新建SpringBoot專案的時候就會在pom引入spring-boot-starter-web,他會將我們所需要的spring和springmvc的依賴自動引入。這樣我們就不用一個一個去找spring和springmvc的這麼多依賴的座標。
  • 使編碼變得簡單,SpringBoot採用 JavaConfig的方式對Spring進行配置,並且提供了大量的註解,極大的提高了工作效率。
  • 自動配置:SpringBoot的自動配置特性利用了Spring對條件化配置的支援,合理地推測應用所需的bean並自動化配置他們;比如在spring中我們如果要將第三方jar包中的類存放到IOC容器中我們需要配置config.xml,在SpringBoot中他會根據pom引入的依賴自動將一些bean裝填到IOC中。
  • 使部署變得簡單,SpringBoot內建了三種Servlet容器,Tomcat,Jetty,undertow.我們只需要一個Java的執行環境就可以跑SpringBoot的專案了,SpringBoot的專案可以打成一個jar包。

2. 建立Springboot專案

2.1 使用Spring Initializr方式構建Spring Boot專案

如果使用idea可以像下圖一樣建立,但是建立過程中必須聯網。當然也可以直接官網https://start.spring.io/ 中建立

然後我們可以選擇我們專案需要的依賴

就這麼簡單,現在Springboot就建立好了,建立好的目錄結構如下

這時候就有疑問了?為什麼Spring專案在pom檔案中為什麼沒有看到Spring和SpringMVC需要的依賴呢?
這就是我們所說的Springboot核心之一的SpringBoot Starter所完成的工作。我們可以看到

     <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!-- ================ -->
      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


我們可以看到spring-boot-starter-web將我們所需要的依賴都已經寫好了,省去了我們自己手動配置的麻煩。

2.2 建立Controller

新建一個Controller包並建立一個Controller類,然後將啟動類SpringbootDemoApplication放在和Controller同級目錄下。因為@SpringBootApplication這個註解只能掃描所在包及子包。

然後執行啟動類訪問就能看到成功訪問。

3. 熱部署

在開發專案過程中,當修改了某些程式碼後需要本地驗證時,需要重啟本地服務進行驗證,啟動這個專案,如果專案龐大的話還是需要較長時間的,spring開發團隊為我們帶來了一個外掛:spring-boot-devtools,很好的解決了本地驗證緩慢的問題。

pom新增

<!-- 引入熱部署依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>

idea設定

在專案任意頁面中使用組合快捷鍵“Ctrl+Shift+Alt+/”開啟選項框,選中並開啟Registry登錄檔頁面

每次修改程式碼不用我們手動重新啟動,引入了外掛後,外掛會監控我們classpath的資源變化,當classpath有變化後,會觸發重啟。

該外掛重啟快速的原因:這裡對類載入採用了兩種類載入器,對於第三方jar包採用base-classloader來載入,對於開發人員自己開發的程式碼則使用restartClassLoader來進行載入,這使得比停掉服務重啟要快的多,因為使用外掛只是重啟開發人員編寫的程式碼部分。

某些資源在更改後不一定需要觸發重新啟動。預設情況下,改變資源 /META-INF/maven , /META-INF/resources , /resources , /static , /public ,或 /templates 不觸發重新啟動,但確會觸發現場重灌。如果要自定義這些排除項,則可以使用該spring.devtools.restart.exclude 屬性。例如,僅排除 /static , /public 您將設定以下屬性:
spring.devtools.restart.exclude=static/**,public/**

4. 全域性配置檔案

4.1 全域性配置檔案概述及優先順序

全域性配置檔案能夠對一些預設配置值進行修改及自定義配置。
Spring Boot使用一個application.properties或者application.yaml的檔案作為全域性配置檔案
也可以從ConfigFileApplicationListener這類便可看出,其中DEFAULT_SEARCH_LOCATIONS屬性設定了載入的目錄:

–file:./config/
–file:./
–classpath:/config/
–classpath:/
  • 先去專案根目錄找config資料夾下找配置檔案件
  • 再去根目錄下找配置檔案
  • 去resources下找cofnig資料夾下找配置檔案
  • 去resources下找配置檔案


SpringBoot會從這四個位置全部載入主配置檔案,如果高優先順序中配置檔案屬性與
低優先順序配置檔案不衝突的屬性,則會共同存在— 互補配置 。

備註:
這裡說的配置檔案,都還是專案裡面。最終都會被打進jar包裡面的,需要注意。
1、如果同一個目錄下,有application.yml也有application.properties,Springboot 2.4版本之前預設先讀取application.properties,2.4版本之後的優先讀取application.yml。
2、如果同一個配置屬性,在多個配置檔案都配置了,預設使用第1個讀取到的,後面讀取的不覆蓋前面讀取到的。
3、建立SpringBoot專案時,一般的配置檔案放置在“專案的resources目錄下”

如果我們的配置檔名字不叫application.properties或者application.yml,可以通過以下引數來指定配置檔案的名字,myproject是配置檔名
$ java -jar myproject.jar --spring.config.name=myproject
我們同時也可以指定其他位置的配置檔案來生效
java -jar run-0.0.1-SNAPSHOT.jar -- spring.config.location=D:/application.properties

4.2 配置檔案屬性注入

使用Spring Boot全域性配置檔案設定屬性時:
如果配置屬性是Spring Boot已有屬性,例如服務埠server.port,那麼Spring Boot內部會自動掃描並讀取這些配置檔案中的屬性值並覆蓋預設屬性。
如果配置的屬性是使用者自定義屬性,例如剛剛自定義的User實體類屬性,還必須在程式中注入這些配置屬性方可生效。

  • @Configuration:宣告一個類作為配置類
  • @Bean:宣告在方法上,將方法的返回值加入Bean容器
  • @Value:屬性注入
  • @ConfigurationProperties(prefix = "jdbc"):批量屬性注入
  • @PropertySource("classpath:/jdbc.properties")指定外部屬性檔案。在類上新增
    比如application.properties新增資訊
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot_h
jdbc.username=root
jdbc.password=123

配置資料來源

  • @Value注入屬性 @Bean加入容器
@Configuration
public class JdbcConfiguration {
@Value("${jdbc.url}")
String url;
@Value("${jdbc.driverClassName}")
String driverClassName;
@Value("${jdbc.username}")
String username;
@Value("${jdbc.password}")
String password;
@Bean
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setDriverClassName(driverClassName);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
}
  • @ConfigurationProperties批量注入
@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
@ConfigurationProperties (prefix = "jdbc") //這裡需要定義出在application檔案中定義屬性值得字首資訊
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
// 注:要生成屬性的set方法
}

@EnableConfigurationProperties 是 Spring Boot 提供的一個註解,使用該註解用於啟用應用對另外一個註解 @ConfigurationProperties 的支援,,用於設定一組使用了註解@ConfigurationProperties 的類,用於作為 bean 定義註冊到容器中。
或者

@Component
@ConfigurationProperties (prefix = "jdbc") //這裡需要定義出在application檔案中定義屬性值得字首資訊
public class JdbcProperties {
private String url;
private String driverClassName;
private String username;
private String password;
// 注:要生成屬性的set方法
}

ConfigurationProperties 使用set注入,必須要生成set方法

5. 鬆散繫結

Spring Boot使用一些寬鬆的規則將環境屬性繫結到@ConfigurationProperties bean,因此環境屬性名和bean屬性名之間不需要完全匹配
例如

public class OwnerProperties {
private String firstName;
}
owner.first-name: 泰森

owner.first-name 羊肉串模式case, 推薦使用
owner.firstName 標準駝峰模式
owner.first_name 下劃線模式
OWNER_FIRSTNAME 大寫下劃線,如果使用系統環境時候推薦使用

7. 日誌框架

Springboot 預設已經使用了 SLF4J(日誌抽象層) + LogBack(日誌實現層)記錄日誌
自定義日誌輸出

# 日誌配置
# 指定具體包的日誌級別
logging.level.com.lagou=debug
# 控制檯和日誌檔案輸出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level
%logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}
- %msg%n
# 日誌輸出路徑,預設檔案spring.log
logging.file.path=spring.log
#logging.file.name=log.log

總結
現在為止我們就可以使用我們建立的SpringBoot框架了,我們可以整合專案中需要的其他框架或者中介軟體。方便了我們的開發,不用做哪些繁瑣的xml配置。