SpringBoot入門(一)——HelloWorld、配置、日誌
iwehdio的部落格園:https://www.cnblogs.com/iwehdio/
1、SpringBoot入門
-
SpringBoot:通過整合整個Spring的技術棧,快速簡單的建立產品級應用,簡化Spring應用開發,約定大於配置。
-
優點:
- 快速建立獨立執行的Spring專案及主流框架整合。
- 使用嵌入式的Servlet容器,應用無序打成WAR包。
- starters自動依賴與版本控制。
- 大量的自動配置,簡化開發,也可以修改預設值。
- 無需配置xml,無程式碼生成。
-
微服務:
- 與之前的單體應用相對應,將每個功能單一獨立出來。
- 是一種架構風格,提倡開發應用時應是一組小型服務的集合。
- 這些小型服務都被放在獨立的服務中,可以通過HTTP通訊。
- 每個服務都是可獨立替換可獨立升級的軟體單元。
-
HelloWorld:
-
瀏覽器傳送一個hello請求,伺服器接收請求並處理,響應Hello World字串。
-
建立一個maven工程並且匯入依賴:
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.9.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
-
編寫一個主程式,啟動SpringBoot應用:
/* 標註一個主程式類,表示這是一個SpringBoot應用 */ @SpringBootApplication public class HelloWorldMainApplication { public static void main(String[] args) { SpringApplication.run(HelloWorldMainApplication.class, args); } }
-
編寫相關的業務邏輯:
@Controller public class HelloController { @ResponseBody @RequestMapping("/hello") public String hello() { return "Hello World"; } }
-
啟動主程式,在瀏覽器就可以訪問/hello了。
-
簡化部署:
-
匯入maven外掛:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
-
在maven側邊欄中執行package命令進行打包,專案被打包在target目錄下。
-
-
-
HelloWorld探究:
-
pom.xml下:
- 父專案:
- spring-boot-starter-parent的父專案是spring-boot-dependencies,它真正亂來的SpringBoot應用中的所有依賴版本,是SPringBoot的版本仲裁中心。
- 在這個版本仲裁中心中管理的依賴,之後再匯入不需要寫版本。
- 匯入的依賴:
- spring-boot-starter-web:spring-boot-starter是SpringBoot場景啟動器。幫我們匯入了web模型正常執行所需要的模組。
- SpringBoot將所有的功能場景抽取出來,做成starts(啟動器),引入starts,相關場景的依賴就會全部匯入進來。
- 父專案:
-
主程式類(主入口類):
-
@SpringBootApplication
註解:標註在某個類上,說明這個類是SpringBoot的主配置類,SpringBoot就應該啟動這個類的main方法來啟動SpringBoot應用。@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @SpringBootConfiguration //表示這個是一個SpringBoot的配置類(類似於之前的配置檔案),配置類也是容器內的一個元件 @EnableAutoConfiguration //開啟自動配置功能 @ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class} ), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class} )} ) public @interface SpringBootApplication {
-
-
-
使用嚮導建立SpringBoot應用:
-
Spring Initializer:SpringBoot建立嚮導。
-
首先,在IDEA的外掛中使SpringBoot外掛為可用。
-
使用Spring Initializer建立工程,選用模組只使用web下的springweb。
-
這樣主程式就生成好了,只需要編寫業務邏輯。
@RestController public class HelloController { @RequestMapping("/hello") public String hello() { return "hello world quick"; } }
@RestController
相當於@Controller
加@ResponseBody。
-
resources資料夾中的目錄結構:
- static:儲存所有的靜態資源。
- templates:儲存了所有的模板頁面。
- application.properties:SpringBoot應用的配置檔案,可以修改預設設定。
-
2、SpringBoot配置
-
配置檔案:
-
預設使用兩種配置檔案application.properties或application.yaml。
- yaml:是一種標記語言,以資料為中心。
- 基本語法:
- 表示鍵值對:
key: value
,冒號後必須有個空格。 - 以空格的縮排來控制層級關係,左對齊的一列資料都是同一層級的。
- 屬性和值是大小寫敏感的。
- 不需要寫分號。
- 表示鍵值對:
- 值的寫法:
- 字面量(數字、字串、布林),字串不用加引號。如果用的話,雙引號內特殊字元會轉義,單引號內特殊字元原樣顯示。
- 鍵值對:在下一行縮排寫鍵值對。行內寫法是用大括號括起來。
- 陣列:
- value
表示陣列中的一個元素。行內寫法用中括號括起來,不用寫 - 。
-
配置檔案的作用:修改SpringBoot自動配置的預設值。
-
SpringBoot單元測試,在測試類上加註解:
@RunWith(SpringRunner.class) @SpringBootTest
-
將yaml中的配置對映到實體類:在實體類上加註解
@ConfigurationProperties(perfix="person")
,配置和那個屬性下一一對應。並且加入容器中。-
需要匯入:配置檔案處理器spring-boot-configuration-processor。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency>
-
也可以直接在Javabean的屬性上加
@Value
,用${}
獲取配置檔案中的值。無法獲取複雜型別,比如map、list。
-
-
在實體類上加
@Validated
,屬性上加入具體校驗規則可以進行資料校驗。 -
@PropertySource()
註解:載入指定的配置檔案。 -
@ImportResource(locations={})
註解:匯入Spring的配置檔案。 -
配置檔案佔位符,
${}
。
-
-
SpringBoot推薦給容器中新增元件的方式:全註解。
- 建立配置類,加上
@Configuration
註解。 - 在方法上添加註解
@Bean
,容器中的預設id為方法名。
- 建立配置類,加上
-
Profile:
-
多Profile檔案實現多環境支援,檔名可以是application-{profile}.properties。
-
啟用指定的profile:預設配置檔案中指定,spring.profiles.active={profile}。
-
yaml支援多文件塊:
-
用三個
-
分為多文件塊。 -
為每個文件塊設定屬性並激活:
spring: profiles: active: prod --- spring: profiles: prod
-
-
也可以使用指定的命令列引數或虛擬機器引數進行啟用。
-
-
配置路徑的載入位置:優先順序從高到低。
- file:./config/
- file:./
- classpath:/config/
- classpath:/
- 高優先順序的配置會覆蓋低優先順序的配置,配置檔案會全部載入,可以進行互補配置。
- 專案打包好後,可以使用命令列引數,使用spring.config.location來設定配置檔案位置。
-
SpringBoot外部配置的載入順序(從高到低):
- 命令列引數。
- jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案。
- jar包內部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案。
- jar包外部的application.properties或application.yml(不帶spring.profile)配置檔案。
- jar包內部的application.properties或application.yml(不帶spring.profile)配置檔案。
-
自動配置原理:
-
SpringBoot啟動時,載入主配置類,開啟了自動配置功能
@EnableAutoConfiguration
。 -
@EnableAutoConfiguration
利用selector為容器中匯入元件。 -
將jar包類路徑下 META-INF/spring.factories裡所有配置的EnableAutoConfiguration.class的值加入到容器中。
-
每一個自動配置類進行自動配置功能。
-
以HttpEncodingAutoConfiguration(Http編碼自動配置)為例解釋自動配置原理:
@Configuration //表示這是一個配置類,以前編寫的配置檔案一樣,也可以給容器中新增元件 @EnableConfigurationProperties(HttpEncodingProperties.class) //啟動指定類的ConfigurationProperties功能;將配置檔案中對應的值和HttpEncodingProperties繫結起來;並把HttpEncodingProperties加入到ioc容器中 @ConditionalOnWebApplication //Spring底層@Conditional註解,根據不同的條件,如果滿足指定的條件,整個配置類裡面的配置就會生效; 判斷當前應用是否是web應用,如果是,當前配置類生效 @ConditionalOnClass(CharacterEncodingFilter.class) //判斷當前專案有沒有這個類CharacterEncodingFilter;SpringMVC中進行亂碼解決的過濾器; @ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true) //判斷配置檔案中是否存在某個配置 spring.http.encoding.enabled;如果不存在,判斷也是成立的 //即使我們配置檔案中不配置pring.http.encoding.enabled=true,也是預設生效的; public class HttpEncodingAutoConfiguration { //他已經和SpringBoot的配置檔案映射了 private final HttpEncodingProperties properties; //只有一個有參構造器的情況下,引數的值就會從容器中拿 public HttpEncodingAutoConfiguration(HttpEncodingProperties properties) { this.properties = properties; } @Bean //給容器中新增一個元件,這個元件的某些值需要從properties中獲取 @ConditionalOnMissingBean(CharacterEncodingFilter.class) //判斷容器沒有這個元件? public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE)); return filter; } }
-
一旦這個配置類生效,這個配置類就會給容器中新增各種元件。這些元件的屬性是從對應的properties類中獲取的,這些類裡面的每一個屬性又是和配置檔案繫結的。
-
-
SpringBoot的精髓:
1)、SpringBoot啟動會載入大量的自動配置類
2)、我們看我們需要的功能有沒有SpringBoot預設寫好的自動配置類;
3)、我們再來看這個自動配置類中到底配置了哪些元件;(只要我們要用的元件有,我們就不需要再來配置了)
4)、給容器中自動配置類新增元件的時候,會從properties類中獲取某些屬性。我們就可以在配置檔案中指定這些屬性的值;
- xxxxAutoConfigurartion:自動配置類,給容器中新增元件。
- xxxxProperties:封裝配置檔案中相關屬性。
-
@Conditional
註解判斷:- 指定一個條件判斷類,指定的條件成立,才給容器中新增元件,配置的內容才生效。
- 派生了許多註解,用於判斷各種情況,比如容器中是否有這個bean。
- 這些註解使得自動配置類在一定的條件下才會生效。
-
自動配置報告:
- 在配置檔案中啟用debug=true,在控制檯列印自動配置報告,就知道那些自動配置類生效了。
3、日誌
-
SpringBoot選用SLF4j日誌門面和logback日誌實現。
-
如何使用SLF4j:
- 開發時日誌記錄日誌的呼叫,不能直接呼叫日誌的實現類,而是呼叫日誌抽象層的方法。
- 配置檔案還是做成日誌實現框架的配置檔案。
- 讓日誌框架都統一到SLF4j,使用中間包和適配層包。
-
SpringBoot日誌關係:
- SpringBoot使用Spring-boot-starter-loggin進行日誌記錄。
- 底層使用logback記錄日誌。
- 使用中間包,把其他日誌框架轉為SLF4j。
- 在此之前需要排除其他日誌框架。
-
SpringBoot中使用日誌:
-
生成日誌記錄器並進行日誌記錄:
Logger logger = LoggerFactory.getLogger(getClass()); //日誌級別由低到高 logger.trace(); logger.debug(); logger.info(); logger.warn(); logger.error();
-
可以調整日誌的級別,日誌就只會在這個級別及以上生效。
-
在配置檔案中設定日誌級別,SpringBoot預設info級別:
logger.level.包名=日誌級別 logging.file=日誌記錄的位置 logging.path=日誌記錄的資料夾 logging.pattern.console=控制檯輸出的日誌格式 logging.pattern.file=檔案中輸出的日誌格式
-