1.什麼是SpringBootcss
產生背景:Spring開發比較繁瑣,配置文件不少,部署流程複雜,整合第三方框架難度大。這會下降開發效率html
SpringBoot是一個簡化Spring應用建立和開發的框架java
整合了整個Spring技術棧,是JavaEE開發一站式解決方案web
2.爲何使用SpringBoot面試
優勢:spring
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>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.9.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath></parent>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
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})})
層級關係:SpringBootConfiguration——>@Configuration——>@Component
@Configuration:標註在類上,表示這個類是Spring的配置類,至關於XML配置文件
1.簡介
使用Spring initializer快速構建SpringBoot項目
2. 基本操做
|-static 存放靜態資源,如js,css,images|-template 存放模板引擎,如freemarker、thymeleaf等|-application.properties SpringBoot應用的配置文件,能夠修改默認設置
1.簡介
SpringBoot的默認全局配置文件有兩種:
文件名固定,存放在classpath:/或classpath:/config/目錄下
能夠修改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 語法規則
2.4 基本用法
YAML支持的數據結構有三種:
三種數據結構的用法:
1.字面量:普通的值,如數字、字符串、布爾值
number: 12.5str: helloname: 'tom cruise' #如字符串包含空格及特殊字符須要使用 引號 引發來name: 'tom \n cruise' #不會對特殊字符進行轉義 結果爲:tom 換行 cruisename: "tom \n cruise" #對特殊字符進行轉義,會做爲普通字符輸出, 結果爲 tom \n cruise
# 寫法1:換行寫user: name: tom age: 20 sex: male # 寫法2:行內寫法user: {name: tom, age: 20, sex: male}
# 寫法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編碼,因此會出現亂碼,可經過勾選解決
優先級: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.多環境配置
能夠爲不一樣環境提供不一樣配置信息,如開發環境、測試環境、生產環境等
兩種方式:
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; }}
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;
注意:
3.總結
能夠經過開啓debug模式查看自動配置類的匹配狀況
#開啓debug模式debug=true
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,獲取。