Spring boot學習(二) Spring boot基礎配置

諾丨言發表於2019-01-17

前言

上一篇部落格中介紹瞭如何建立一個簡單的Spring boot應用,本篇文章介紹Spring boot中的一些基本配置,只有認識和了解這些配置,才能為我們以後的深入學習Spring boot做好鋪墊。

文章首發於個人部落格:【www.xiongfrblog.cn

入口類

首先,我們在新建一個Spring boot專案的時候,Spring boot會自動為我們在包的根目錄下建立一個名為xxxApplication.java的啟動類,該啟動類是我們專案的入口類,包含一個main方法,執行該方法就啟動了專案。

啟動類中有一個核心的註解@SpringBootApplication,它是一個組合註解,包含以下三個註解:

  1. @Configuration:表示將當前類作為Spring的配置類,經常配合@Bean使用將某個物件註冊到Spring上下文。
  2. @EnableAutoConfiguration:表示啟動程式時自動載入Spring boot的預設配置。
  3. @ComponentScan:表示啟動程式時自動掃描當前包及子包下所有交由Spring管理的類,比如被@Component@Service@Controller等標記的類。

注意

上邊說過啟動類一般放在包的根目錄下,是因為@ComponentScan註解預設掃描當前包及子包,如果需要指定掃描路徑,需要加上引數,例如@ComponentScan("com.example.demo.dao")

Spring boot官方配置了@SpringBootApplication註解來替代上邊介紹的三個註解,更加簡潔明瞭。

全域性配置檔案

Spring boot使用一個全域性的配置檔案application.propertiesapplication.yml,該配置檔案一般位於src/main/resource目錄下,兩種配置檔案唯一的區別就在於書寫的格式不一樣,現在比較主流的是application.yml格式的配置檔案,要熟練使用該種格式的配置檔案需要熟悉基礎的yaml語法,這裡不做過多介紹,本篇部落格均使用application.properties格式的配置檔案,下面介紹兩個最基本的配置。

修改專案啟動埠

server.port=1188
複製程式碼

修改訪問專案的預設路徑

一般訪問專案的根路徑預設localhost:1188,但是有時候我們會在訪問路徑上加上當前專案的名字,這時候就需要修改預設的訪問路徑了。

#spring boot版本2.0以下
server.context-path=/demo
#spring boot版本2.0以上
server.servlet.context-path=/demo
複製程式碼

這裡根據Spring boot的版本不同有不同的配置們大家根據自己的版本選擇對應的屬性名即可,由於我的Spring boot版本是2.1.2,所以選擇server.servlet.context-path的屬性名,此時訪問專案的根路徑就的url就變成了localhost:1188/demo

其它配置

當然,Spring boot中可以配置屬性還有很多,比如配置 Email:

spring.mail.default-encoding=UTF-8 # Default MimeMessage encoding.
spring.mail.host= # SMTP server host. For instance, `smtp.example.com`.
spring.mail.jndi-name= # Session JNDI name. When set, takes precedence over other Session settings.
spring.mail.password= # Login password of the SMTP server.
spring.mail.port= # SMTP server port.
spring.mail.properties.*= # Additional JavaMail Session properties.
spring.mail.protocol=smtp # Protocol used by the SMTP server.
spring.mail.test-connection=false # Whether to test that the mail server is available on startup.
spring.mail.username= # Login user of the SMTP server.
複製程式碼

這裡就不列舉了,太多了,具體可以查閱官方文件【傳送門】

自定義屬性

在實際專案中,很多情況我們需要定義一些全域性屬性,在需要的地方注入使用即可,Spring boot允許我們在application.properties下自定義一些屬性,下面介紹自定義屬性並且使用。

在配置檔案中定義屬性

blog.login.name=admin
blog.login.pass=1234
複製程式碼

我們在application.properties定義了blog.login.nameblog.login.pass兩個屬性。

注入自定義屬性

為了方便演示,我們定義一個名為TestController.java的控制器,使用@Value註解注入屬性,全部程式碼如下:

package com.web.springbootconfig.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
* @author Promise
* @createTime 2018年12月27日 下午10:11:35
* @description 
*/
@Controller
public class TestController {
	
	@Value("${blog.login.name}")
	private String name;
	
	@Value("${blog.login.pass}")
	private String pass;
	
	@RequestMapping("/test")
	@ResponseBody
	public String configTest() {
		return "name="+name+";pass="+pass+";nick="+nick;
	}
}
複製程式碼

可以看到使用@Value(屬性名名)的方式注入我們自定義的屬性,此時啟動專案瀏覽器訪問localhost:1188/demo/test127.0.0.1:1188/demo/test得到如下結果:

在這裡插入圖片描述

由圖可以看出,我們拿到了在配置檔案中自定義屬性的值admin1234

這裡有一點需要大家特別注意,只有在被Spring管理的類中才能注入屬性,比如上文中我們的TestController.java控制器類名上加了@Controller註解,表明將此類交由Spring管理。

簡單驗證

新建一個Text.java類,內容如下:

package com.web.springbootconfig.entity;

import org.springframework.beans.factory.annotation.Value;

/**
* @author Promise
* @createTime 2019年1月14日 下午11:35:52
* @description 
*/
public class Test {

	@Value("${blog.login.name}")
	private String name;
	
	@Value("${blog.login.pass}")
	private String pass;

	//省略getter,setter方法
}
複製程式碼

再在TestController.java控制器中新增如下方法:

    @RequestMapping("/check")
	@ResponseBody
	public String check() {
		Test test =new Test();
		return "name="+test.getName()+";pass="+test.getPass();
	}
複製程式碼

重啟專案,瀏覽器訪問localhost:1188/demo/check,此時得到如下結果:

在這裡插入圖片描述

可以看到輸出為null,正是因為我們的Text.java類沒有交由Spring管理,所以Spring並沒有為我們自動注入屬性,這點一定要注意!

熱部署

從之前的操作中,很多小夥伴肯定已經發現了我們每次對專案做修改的時候都需要手動重啟專案才能夠正確訪問到新的內容,這對我們平常的開發來說肯定非常不友好的,別擔心,Spring boot也為我們設計了熱部署功能,修改完程式碼儲存之後Spring boot會自動重啟載入最新的內容,只需要我們簡單的配置即可。

Devtools

Spring為開發者提供了一個名為spring-boot-devtools的模組來使Spring boot應用支援熱部署,提高開發者的開發效率,無需手動重啟Spring boot應用。

修改pom.xml

pom.xml檔案中新增Devtools依賴,程式碼如下:

<!-- 熱部署 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
</dependency>
複製程式碼

並且修改build模組,如下:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
                <fork>true</fork>
            </configuration>
		</plugin>
	</plugins>
</build>
複製程式碼

修改application.properties配置檔案

在配置檔案中新增如下內容(其實不新增也可以,因為預設就是開啟的,這裡提出來是方便有時候可以關閉熱部署。)

spring.devtools.restart.enabled: true
複製程式碼

需要關閉熱部署功能時將屬性值設定為false即可。

好了,至此熱部署的功能就已經配置完成了,現在可以啟動專案,然後隨便修改一個檔案儲存,你會發現控制檯已經更新了日誌,等待專案重新啟動之後發現更新的內容已經展示在瀏覽器上了。

Profile配置

在實際的企業級開發過程中,我們總是有開發環境,生產環境等不同的環境,同一個專案在每一個不同的環境需要的配置總是不一樣的,這時候如果每換一個環境就修改一次application.properties配置檔案的內容,對開發人員來說是非常糟糕的體驗,所以Spring boot為我們提供了不同環境指定特定的配置檔案的功能,而我們只需要簡單的配置即可,完美解決難題。

多環境配置檔案必須以application-{profile}.properties的格式命名,其中{profile}為環境標識,比如我們有一個開發環境需設定啟動埠為1188,一個生產環境需設定啟動埠為1189,兩個配置檔案分別為:

  • application-dev.properties:開發環境
    server.port=1188
    複製程式碼
  • application-prod.properties:生成環境
    server.port=1189
    複製程式碼

啟動專案具體載入哪個配置檔案需要在application.properties配置檔案中新增如下程式碼指定(比如我們使用開發環境):

spring.profiles.active=dev
複製程式碼

專案打包

pom.xml配置

Spring boot可以將專案打成不同型別的包,比如jar包,war包,pom包等,這裡我們只介紹最長用的jar包,打包需要在pom.xml檔案中有如下的配置(這裡貼出完整的pom.xml):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.web</groupId>
	<artifactId>springboot-config</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>
	<name>springboot-config</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		<!-- 熱部署 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
			<optional>true</optional>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
	                <fork>true</fork>
	            </configuration>	            
			</plugin>
		</plugins>
	</build>

</project>
複製程式碼

其中關於打包的重要程式碼為:

指定打包的型別

<packaging>jar</packaging>
複製程式碼

Spring Boot Maven打包外掛spring-boot-maven-plugin,該外掛將專案打成一個可執行的jar包,包括把應用程式的所有依賴打入jar檔案內,能讓你在命令列用java -jar來執行應用程式。

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
                <fork>true</fork>
            </configuration>	            
		</plugin>
	</plugins>
</build>
複製程式碼

使用eclipse打包

右鍵專案選擇Run As->Maven build,在彈出框的Goals輸入clean package點選Run即可。

打包前在專案的根目錄下會發現一個空的target資料夾,打包生成的檔案會放在這個資料夾內,打包前:

在這裡插入圖片描述

打包後:

在這裡插入圖片描述

可以看到生成了一個jar檔案。

執行jar包

命令列進入jar包所在的目錄,執行Java -jar jar包名.jar即可啟動專案,此時啟動瀏覽器訪問localhost:1188/demo/test可以看到與之前一樣的內容。

命令列引數

在執行jar包的時候我們也可以指定引數,比如指定埠號為8089java -jar jar包名.jar --server.port=8089,也可以指定使用哪個環境的配置檔案等很多東西,這裡不一一概述了。

結語

好了,Spring boot的一些基礎的配置就說到這裡,更多的內容需要我們自己在不斷的實踐中繼續瞭解,下期內容再見,bye~

相關文章