深刻淺出Spring Boot框架--6個知識點小結!

1、SpringBoot簡介

1.什麼是SpringBootcss

產生背景:Spring開發比較繁瑣,配置文件不少,部署流程複雜,整合第三方框架難度大。這會下降開發效率html

SpringBoot是一個簡化Spring應用建立和開發的框架java

整合了整個Spring技術棧,是JavaEE開發一站式解決方案web

2.爲何使用SpringBoot面試

優勢:spring

  • 能夠快速構架Spring項目,並與主流框架進行集成
  • 內置Servlet容器,不須要手動部署war包
  • 使用starter管理依賴並進行版本控制
  • 大量自動配置,簡化開發
  • 提供準生產環境的運行時監控
  • 不須要XML文件

2、第一個SpringBoot程序

1.操做步驟apache

步驟:api

1.1 建立一個Maven的jar工程數組

傳統的應用須要建立web工程,而後將應用打成war包,而後部署在容器中tomcat

而SpringBoot只須要打成一個jar包,其中內置了tomcat

1.2 導入SpringBoot相關依賴

<?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> <groupId>com.ly</groupId> <artifactId>springboot01-helloworld</artifactId> <version>1.0-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version> </parent> <name>springboot01-helloworld</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <build> </build></project>

1.3 建立Controller

package com.ly.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;/** * Author: LuYi * Date: 2019/10/27 11:05 * Description: 描述 */@Controllerpublic class HelloController { @RequestMapping("/hello") @ResponseBody public String hello(){ return "Hello World"; }}

1.4 建立啓動類

package com.ly;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * Author: LuYi * Date: 2019/10/27 11:05 * Description: 使用@SpringBootApplication將類標註成SpringBoot應用 */@SpringBootApplicationpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); }}

默認會掃描@SpringBootApplication註解所在的包及其子包,也可以使用@ComponentScan("com.ly.controller")註解進行指定

1.5 打包

<!--該插件能夠將應用打包成一個可執行的jar包--><build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins></build>

添加該插件,將應用打成可執行的jar包, 執行:java -jar jar文件

2. 分析HelloWorld

2.1 POM文件

  • 父工程
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.9.RELEASE</version></parent>
  • 父工程的父工程:用來管理SpringBoot應用中依賴的版本,進行版本控制
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.9.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath></parent>
  • 依賴:經過starter指定依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
  • SpringBoot提供了不少starter(啓動器),分別對應了不一樣的應用場景,當在項目中引入這些starter時,相應場景的依賴就會被導入進來

2.2 啓動類

@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan( excludeFilters = {@Filter( type = FilterType.CUSTOM, classes = {TypeExcludeFilter.class}), @Filter( type = FilterType.CUSTOM, classes = {AutoConfigurationExcludeFilter.class})})
  • @SpringBootApplication
  • 標註在類上,表示這個類是SpringBoot的啓動類,經過該類的Main方法啓動SpringBoot應用
  • @SpringBootConfiguration
  • 標註在類上,表示這個類是SpringBoot的配置類
  • 層級關係:SpringBootConfiguration——>@Configuration——>@Component

    @Configuration:標註在類上,表示這個類是Spring的配置類,至關於XML配置文件

  • @EnableAutoConfiguration
  • 開啓自動配置功能,簡化了之前繁瑣的配置
  • SpringBoot在啓動時會在/META-INF/spring.factories中EnableAutoConfiguration指定的值,將這些值做爲自動配置類添加到容器中,這些自動配置類會幫咱們完成不少配置工做。
  • @ComponentScan
  • 標註在類上,指定要掃描的包及其子包

3、快速建立SpringBoot項目

1.簡介

使用Spring initializer快速構建SpringBoot項目

2. 基本操做

  • pom文件和主程序類自動生成,直接寫業務邏輯便可
  • resources文件夾的目錄結構
|-static    存放靜態資源,如js,css,images|-template 存放模板引擎,如freemarker、thymeleaf等|-application.properties   SpringBoot應用的配置文件,能夠修改默認設置

4、配置文件

1.簡介

SpringBoot的默認全局配置文件有兩種:

  • application.properties
  • application.yml

文件名固定,存放在classpath:/或classpath:/config/目錄下

深刻淺出Spring Boot框架--6個知識點小結!

能夠修改Spring Boot默認配置,具體參考: http://docs.spring.io/spring-boot

注意:SpringBoot2.0和1.0的配置有區別,有的配置項已被刪除

2.YAML用法

2.1 簡介

YAML不是一種標記語言,YAML是專門用來寫配置文件的,它以數據爲中心,簡介強大,比xml和properties更適合作配置文件

YAML文件以.yml或.yaml爲後置名

2.2 application.yml

server: port: 8081  #寫法:key: value 冒號後面必須有空格 servlet: context-path: /springboot03/

2.3 語法規則

  • 大小寫敏感
  • 使用縮進表示層級關係
  • 縮進時不容許使用Tab鍵
  • 縮進的空格數目不重要,可是要與對應的層級的左側對齊
  • #表示註釋

2.4 基本用法

YAML支持的數據結構有三種:

  • 字面量:單個的,不可再分的值(字符串、數字、boolean值)
  • 對象:鍵值對集合
  • 數組:一組按次序排列的值

三種數據結構的用法:

1.字面量:普通的值,如數字、字符串、布爾值

number: 12.5str: helloname: 'tom cruise' #如字符串包含空格及特殊字符須要使用 引號 引發來name: 'tom \n cruise' #不會對特殊字符進行轉義 結果爲:tom 換行 cruisename: "tom \n cruise" #對特殊字符進行轉義,會做爲普通字符輸出, 結果爲 tom \n cruise
  1. 對象,也成爲映射Map,包含屬性和值
# 寫法1:換行寫user: name: tom age: 20 sex: male # 寫法2:行內寫法user: {name: tom, age: 20, sex: male}
  1. 數組,如List、Set等
# 寫法1: 一組短橫線開頭的行names:  - tom - jack - alice # 寫法2: 行內寫法name: {tom,jack,alice}

3. 爲屬性注入值

經過加載配置文件,爲類中的屬性注入值

3.1 編寫application.yml

user: username: admin age: 21 status: true birthday: 2019/2/14 address: province: 黑龍江省 city: 哈爾濱市 lists: - list1 - list2 - list3 maps: {k1: v1,k2: v2}

3.2 建立實體類

User

package com.luyi.bean;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;import java.util.Date;import java.util.List;import java.util.Map;/** * Author: LuYi * Date: 2019/10/27 13:49 * Description: 經過加載配置文件爲當前類中的屬性注入值 */// 必須將當前類加入到容器@Component// 默認讀取全局配置文件獲取值,當前類中的全部屬性與 user 進行綁定@ConfigurationProperties(value = "user")public class User { private String username; private Integer age; private Boolean status; private Date birthday; private Address address; private List<String> lists; private Map<String, Object> maps; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Boolean getStatus() { return status; } public void setStatus(Boolean status) { this.status = status; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public Address getAddress() { return address; } public void setAddress(Address address) { this.address = address; } public List<String> getLists() { return lists; } public void setLists(List<String> lists) { this.lists = lists; } public Map<String, Object> getMaps() { return maps; } public void setMaps(Map<String, Object> maps) { this.maps = maps; } @Override public String toString() { return "User{" + "username='" + username + '\'' + ", age=" + age + ", status=" + status + ", birthday=" + birthday + ", address=" + address + ", lists=" + lists + ", maps=" + maps + '}'; }}

Address

package com.luyi.bean;/** * Author: LuYi * Date: 2019/10/27 13:50 * Description: 描述 */public class Address { private String province; private String city; public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Override public String toString() { return "Address{" + "province='" + province + '\'' + ", city='" + city + '\'' + '}'; }}

3.3 測試

package com.luyi.springboot03config;import com.luyi.bean.User;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;@SpringBootTestclass Springboot03ConfigApplicationTests { @Autowired private User user; @Test void contextLoads() { System.out.println(user); }}

3.4 添加配置文件處理器依賴(可選)

<!--配置文件處理器,自動生成元數據信息,編寫配置文件會有提示--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional></dependency>

3.5 使用properties配置文件

user.username=aliceuser.age=22user.status=falseuser.birthday=2019/10/27user.address.province=黑龍江省user.address.city=哈爾濱user.lists=list1,list2,list3user.maps.k1=v1user.maps.k2=v2

注意:在IDEA中默認使用UTF-8編碼,properties文件默認使用ASCII編碼,因此會出現亂碼,可經過勾選解決

深刻淺出Spring Boot框架--6個知識點小結!

優先級:properties > yml

3.6 使用@Value註解注入值

@Value("${user.username}")private String username;@Value("${user.age}")private Integer age;@Value("${user.status}")private Boolean status;@Value("${user.birthday}")private Date birthday;//@Value不支持複雜類型封裝private Address address;@Value("${user.lists}")private List<String> lists;private Map<String, Object> maps;

@Value與@ConfigurationProperties比較:

  • 前者只能夠單值注入,後者能夠批量注入
  • 前者不支持爲複雜類型封裝,後者支持

4.多環境配置

能夠爲不一樣環境提供不一樣配置信息,如開發環境、測試環境、生產環境等

兩種方式:

  • 建立多個properties文件
  • 定義yml文檔塊

4.1 建立多個properties文件

步驟:

1.建立不一樣環境的properties文件

文件命名必須符合aplication-xxx.properties的格式

application-dev.properties

server.port=9991

application-test.properties

server.port=9992

application-prod.properties

server.port=9993

2.在application.properties中指定須要激活的配置

#指定要激活的配置spring.profiles.active=prod

4.2 定義yml文檔塊

1.在yml中使用三個短橫線定義多個文檔塊

spring: profiles: devserver: port: 9991---spring: profiles: testserver: port: 9992---spring: profiles: prodserver: port: 9993

2.在第一個文檔塊指定要激活的環境

spring: profiles: active: test---

5.加載外部配置文件

5.1 加載properties屬性文件

問題:@ConfigurationProperties默認是從全局配置文件中讀取值,若是想自定義屬性文件中獲取值怎麼辦?

解決:使用@PropertySource註解加載外部屬性文件

// 必須將當前類加入到容器@Component//加載外部的屬性文件@PropertySource({"classpath:user.properties"})// 默認讀取全局配置文件獲取值,當前類中的全部屬性與 user 進行綁定@ConfigurationProperties(value = "user")public class User{

5.2 加載spring配置文件

問題:若是有信息須要寫道xml文件中,想加載xml文件怎麼辦

解決:使用@ImportResource加載外部配置文件

5.3 使用註解方式添加組件

推薦使用全註解方式向Spring容器添加組件,@Configuration和@Bean

/** * Author: LuYi * Date: 2019/10/28 14:49 * Description: 描述 *///添加在類上,表示這個類是一個配置類,至關於spring配置文件@Configurationpublic class SpringConfig { //標註在方法上,用來向容器中添加組件,將方法的返回值添加到容器中,方法名做爲bean的id @Bean public Address address(){ Address address = new Address(); address.setProvince("山東"); address.setCity("日照"); return address; }}

5、SpringBoot自動配置原理

1.執行流程

1.SpringBoot啓動時加載主配置類,使用@EnableAutoConfiguration開啓了自動配置功能

2.@EnableAutoConfiguration中使用了 @Import({AutoConfigurationImportSelector.class})向容器中添加了一些組件(自動配置類)

查看AutoConfigurationImportSelector類中的selectImports方法,再點擊getAutoConfigurationEntry方法中的`getCandidateConfigurations方法

經過getCandidateConfigurations中的loadFactoryNames方法加載到SpringFactory,

再經過classLoader加載META-INF/spring.factories的配置,從配置中獲取EnableAutoConfiguration(spring-boot-autoconfigure-2.1.9.RELEASE.jar)對應的值。

將這些自動配置類(xxxAutoConfiguration)添加到容器中

3.經過自動配置類完成自動配置功能。

2. 原理分析

以HttpEncodingAutoConfiguration爲例,就是之前在web.xml中配置的CharacterEncodingFilter過濾器

//表示這是一個配置類,至關於之前編寫的Spring配置文件@Configuration//啓用HttpProperties類的ConfigurationProperties功能,經過配置文件爲屬性注入值,並將其添加到容器中@EnableConfigurationProperties({HttpProperties.class})//當該應用是web應用時才生效@ConditionalOnWebApplication( type = Type.SERVLET)//必須包含CharacterEncodingFilter類才生效@ConditionalOnClass({CharacterEncodingFilter.class})//若是配置文件中有spring.http.encoding選項則該配置生效,不然不生效。可是默認已經生效了@ConditionalOnProperty( prefix = "spring.http.encoding", value = {"enabled"}, matchIfMissing = true)public class HttpEncodingAutoConfiguration { private final Encoding properties;   //將容器中的HttpProperties注入 public HttpEncodingAutoConfiguration(HttpProperties properties) { this.properties = properties.getEncoding(); } //將返回的filter添加到容器中,做爲bean @Bean //若是容器中沒有這個bean纔會生效 @ConditionalOnMissingBean public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE)); return filter; } //從配置文件中獲取指定的值,而後綁定到指定的屬性值@ConfigurationProperties( prefix = "spring.http")public class HttpProperties { private Charset charset; private Boolean force; private Boolean forceRequest; private Boolean forceResponse; private Map<Locale, Charset> mapping;

注意:

  • 根據當前狀況進行判斷,決定配置類是否生產,若是不知足條件自動配置就不會生效
  • 自動配置類xxAutoConfiguration的屬性是從對應的xxProperties類中獲取
  • xxProperties類中的信息是經過配置文件注入綁定的,能夠經過配置文件指定屬性的值

3.總結

  • SpringBoot在啓動時會加載大量的自動配置類
  • 經過自動配置了向容器中添加組件
  • 經過這些組件自動完成許多功能,從而簡化配置

能夠經過開啓debug模式查看自動配置類的匹配狀況

#開啓debug模式debug=true

6、Web開發

1.簡介

使用SpringBoot開發Web應用的步驟:

1.建立SpringBoot項目,添加對應的starter

2.在配置文件中指定必要的少許配置

3.編寫業務代碼

Web開發的自動配置類WebMvcAutoConfiguration

2.關於靜態資源的映射

2.1 靜態資源的位置

查看WebMvcAutoConfiguration——>addResourceHandlers()——>getStaticLocations()——>staticLocations

靜態資源的默認位置

"classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/"

能夠經過上面的文件夾能夠訪問到靜態資源

也能夠在配置文件中本身指定能夠訪問的位置

# 指定靜態資源的位置 存放在根目錄下的public文件夾中spring.resources.static-locations=classpath:/public

2.2 歡迎頁

查看WebMvcAutoConfiguration—>welcomePageHandlerMapping()—>getWelcomePage()

將index.html頁面放到任意一個靜態資源文件夾中的

2.3 網站圖標

查看WebMvcAutoConfiguration—>內部類FaviconConfiguration—>faviconHandlerMapping

將favicon.ico放到靜態資源的任意文件夾中便可

springboot面試題、以及Spring Boot 學習筆記完整教程 關注關注:麒麟改bug,獲取。

相關文章
相關標籤/搜索