天天看點

springboot系列知識

前言

Spring Boot都很熟悉了,再重新認識學習一遍。

一、Spring Boot 入門

Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring.

上面是引自官網的一段話,大概是說: Spring Boot 是所有基于 Spring 開發的項目的起點。Spring Boot 的設計是為了讓你盡可能快的跑起來 Spring 應用程式并且盡可能減少你的配置檔案

1、Spring Boot 簡介

簡化Spring應用開發的一個架構;

整個Spring技術棧的一個大整合;

J2EE開發的一站式解決方案;

2、微服務

微服務是一種架構風格,簡單了解就是服務微化,一個應用應該是一組小型服務,可以通過HTTP的方式進行互通,和微服務相反的是單體應用,微服務是每一個功能元素最終都是一個可獨立替換和獨立更新的軟體單元;

詳細參照微服務文檔

3、啟動器

Spring Boot将所有的功能場景都抽取出來,做成一個個的starters(啟動器),隻需要在項目裡面引入這些starter相關場景的所有依賴都會導入進來。要用什麼功能就導入什麼場景的啟動器,而且版本由springboot自動控制

4、啟動器

用 @SpringBootApplication 來标注一個主程式類,說明這是一個Spring Boot應用,編寫一個main方法,如下:

@SpringBootApplication
public class HelloWorldMainApplication {

    public static void main(String[] args) {

        // Spring應用啟動起來
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}
           

@SpringBootApplication: Spring Boot應用标注在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運作這個類的main方法來啟動SpringBoot應用;

==Spring Boot在啟動的時候從類路徑下的META-INF/spring.factories中擷取EnableAutoConfiguration指定的值,将這些值作為自動配置類導入到容器中,自動配置類就生效,幫我們進行自動配置工作;==以前我們需要自己配置的東西,自動配置類都幫我們;

J2EE的整體整合解決方案和自動配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;

5、使用Spring Initializer快速建立Spring Boot項目

需要前面說明的是使用Spring Initializer的方式有可能你的idea會沒有這個選項,那是因為那是社群版的,你需要下載下傳非社群版的idea才可以使用Spring Initializer

springboot系列知識
springboot系列知識

想要用什麼功能直接勾選相應的starter即可

springboot系列知識

建立好後的目錄結構如下:

springboot系列知識

預設生成的Spring Boot項目;

  • 主程式已經生成好了,我們隻需要我們自己的邏輯
  • resources檔案夾中目錄結構
    • static:儲存所有的靜态資源; js css images;
    • templates:儲存所有的模闆頁面;(Spring Boot預設jar包使用嵌入式的Tomcat,預設不支援JSP頁面);可以使用模闆引擎(freemarker、thymeleaf);
    • application.properties:Spring Boot應用的配置檔案;可以修改一些預設設定;

二、配置檔案

1、配置檔案

SpringBoot使用一個全局的配置檔案,配置檔案名是固定的;叫application.properties或者application.yml,配置檔案的作用是修改SpringBoot自動配置的預設值;SpringBoot在底層都給我們自動配置好;

2、YAML簡介

以前的配置檔案,大多都使用的是 xxxx.xml檔案,YAML檔案則是以資料為中心,比json、xml等更适合做配置檔案,

YAML:配置例子

server:
  port: 8081           

​ XML:

<server>
    <port>8081</port>
</server>           

基本文法:

k:(空格)v:表示一對鍵值對(空格必須有)

以空格的縮進來控制層級關系;隻要是左對齊的一列資料,都是同一個層級的

server:
    port: 8081
    path: /hello           

屬性和值也是大小寫敏感

值的寫法:

字面量:普通的值(數字,字元串,布爾)

k: v:字面直接來寫;

字元串預設不用加上單引号或者雙引号,如果機上有特殊轉移如下:

​    "":雙引号;不會轉義字元串裡面的特殊字元;特殊字元會作為本身想表示的意思

​                name:   "zhangsan \n lisi":輸出;zhangsan 換行  lisi

​        '':單引号;會轉義特殊字元,特殊字元最終隻是一個普通的字元串資料

​                name:   ‘zhangsan \n lisi’:輸出;zhangsan \n  lisi           

對象、Map(屬性和值)(鍵值對):

​    k: v:在下一行來寫對象的屬性和值的關系;注意縮進

​        對象還是k: v的方式
friends:
        lastName: zhangsan
        age: 20


行内寫法:
friends: {lastName: zhangsan,age: 18}           

數組(List、Set):

用- 值表示數組中的一個元素
pets:
 - cat
 - dog
 - pig
 -
 行内寫法
 pets: [cat,dog,pig]           

3、配置檔案值注入

配置檔案:

person:
    lastName: hello
    age: 18
    boss: false
    birth: 2017/12/12
    maps: {k1: v1,k2: 12}
    lists:
      - lisi
      - zhaoliu
    dog:
      name: 小狗
      age: 12           

javaBean:

/**
 * 将配置檔案中配置的每一個屬性的值,映射到這個元件中
 * @ConfigurationProperties:告訴SpringBoot将本類中的所有屬性和配置檔案中相關的配置進行綁定;
 *      prefix = "person":配置檔案中哪個下面的所有屬性進行一一映射
 *
 * 隻有這個元件是容器中的元件,才能容器提供的@ConfigurationProperties功能;
 *
 */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
           

可以導入配置檔案處理器,以後編寫配置就有提示了

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>
    
           

@Value擷取值和@ConfigurationProperties擷取值比較

@ConfigurationProperties @Value
功能 批量注入配置檔案中的屬性 一個個指定
松散綁定(松散文法) 支援 不支援
SpEL
JSR303資料校驗
複雜類型封裝

配置檔案yml還是properties他們都能擷取到值;

如果說,我們隻是在某個業務邏輯中需要擷取一下配置檔案中的某項值,使用@Value;

如果說,我們專門編寫了一個javaBean來和配置檔案進行映射,我們就直接使用@ConfigurationProperties;

如何定義配置檔案呢?

1、配置類@Configuration------>Spring配置檔案

2、使用@Bean給容器中添加元件

/**
 * @Configuration:指明目前類是一個配置類;就是來替代之前的Spring配置檔案
 *
 * 在配置檔案中用<bean><bean/>标簽添加元件
 *
 */
@Configuration
public class MyAppConfig {

    //将方法的傳回值添加到容器中;容器中這個元件預設的id就是方法名
    @Bean
    public HelloService helloService02(){
        System.out.println("配置類@Bean給容器中添加元件了...");
        return new HelloService();
    }
}           

4、配置檔案占位符

1、随機數

${random.value}、${random.int}、${random.long}
${random.int(10)}、${random.int[1024,65536]}
           

2、占位符擷取之前配置的值,如果沒有可以是用:指定預設值

person.last-name=張三${random.uuid}
person.age=${random.int}
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=${person.hello:hello}_dog
person.dog.age=15           

5、Profile

1、多Profile檔案

我們在主配置檔案編寫的時候,檔案名可以是 application-{profile}.properties/yml

預設使用application.properties的配置;

2、yml支援多文檔塊方式

server:
  port: 8081
spring:
  profiles:
    active: prod

---
server:
  port: 8083
spring:
  profiles: dev


---

server:
  port: 8084
spring:
  profiles: prod  #指定屬于哪個環境           

3、激活指定profile

​ 1、在配置檔案中指定 spring.profiles.active=dev

​ 2、指令行:

​ java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;

​ 可以直接在測試的時候,配置傳入指令行參數

​ 3、虛拟機參數;

​ -Dspring.profiles.active=dev

6、配置檔案加載位置

springboot 啟動會掃描以下位置的application.properties或者application.yml檔案作為Spring boot的預設配置檔案

–file:./config/

–file:./

–classpath:/config/

–classpath:/

優先級由高到底,高優先級的配置會覆寫低優先級的配置;

SpringBoot會從這四個位置全部加載主配置檔案;互補配置;

==我們還可以通過spring.config.location來改變預設的配置檔案位置==

項目打包好以後,我們可以使用指令行參數的形式,啟動項目的時候來指定配置檔案的新位置;指定配置檔案和預設加載的這些配置檔案共同起作用形成互補配置;

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

7、外部配置加載順序

==SpringBoot也可以從以下位置加載配置; 優先級從高到低;高優先級的配置覆寫低優先級的配置,所有的配置會形成互補配置==

1.指令行參數

所有的配置都可以在指令行上進行指定

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc

多個配置用空格分開; --配置項=值

2.來自java:comp/env的JNDI屬性

3.Java系統屬性(System.getProperties())

4.作業系統環境變量

5.RandomValuePropertySource配置的random.*屬性值

==由jar包外向jar包内進行尋找;==

==優先加載帶profile==

6.jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案

7.jar包内部的application-{profile}.properties或application.yml(帶spring.profile)配置檔案

==再來加載不帶profile==

8.jar包外部的application.properties或application.yml(不帶spring.profile)配置檔案

9.jar包内部的application.properties或application.yml(不帶spring.profile)配置檔案

10.@Configuration注解類上的@PropertySource

11.通過SpringApplication.setDefaultProperties指定的預設屬性

所有支援的配置加載來源;

參考官方文檔

8、自動配置原理

SpringBoot啟動的時候加載主配置類,開啟了自動配置功能 ==@EnableAutoConfiguration,SpringBoot啟動會加載大量的自動配置類 我們看我們需要的功能有沒有SpringBoot預設寫好的自動配置類;我們再來看這個自動配置類中到底配置了哪些元件;(隻要我們要用的元件有,我們就不需要再來配置了)給容器中自動配置類添加元件的時候,會從properties類中擷取某些屬性。我們就可以在配置檔案中指定這些屬性的值;

xxxxAutoConfigurartion:自動配置類;

給容器中添加元件

xxxxProperties:封裝配置檔案中相關屬性;

三、日志

1、SpringBoot采用的日志架構

SpringBoot選用 SLF4j和logback作為日志架構

2、統一日志架構

當我們用到其他架構如mybatis等有自己的日志架構,這個時候需要進行日志架構的 統一,步驟很簡單:

==1、将系統中其他日志架構先排除出去;==

==2、用中間包來替換原有的日志架構;==

==3、我們導入slf4j其他的實作==

==SpringBoot能自動适配所有的日志,而且底層使用slf4j+logback的方式記錄日志,引入其他架構的時候,隻需要把這個架構依賴的日志架構排除掉即可;==

3、日志配置檔案

//記錄器
    Logger logger = LoggerFactory.getLogger(getClass());
    @Test
    public void contextLoads() {
        //System.out.println();

        //日志的級别;
        //由低到高   trace<debug<info<warn<error
        //可以調整輸出的日志級别;日志就隻會在這個級别以以後的進階别生效
        logger.trace("這是trace日志...");
        logger.debug("這是debug日志...");
        //SpringBoot預設給我們使用的是info級别的,沒有指定級别的就用SpringBoot預設規定的級别;root級别
        logger.info("這是info日志...");
        logger.warn("這是warn日志...");
        logger.error("這是error日志...");


    }           
日志輸出格式:
    %d表示日期時間,
    %thread表示線程名,
    %-5level:級别從左顯示5個字元寬度
    %logger{50} 表示logger名字最長50個字元,否則按照句點分割。 
    %msg:日志消息,
    %n是換行符
-->
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n           
logging.level.com.atguigu=trace


#logging.path=
# 不指定路徑在目前項目下生成springboot.log日志
# 可以指定完整的路徑;
#logging.file=G:/springboot.log

# 在目前磁盤的根路徑下建立spring檔案夾和裡面的log檔案夾;使用 spring.log 作為預設檔案
logging.path=/spring/log

#  在控制台輸出的日志的格式
logging.pattern.console=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定檔案中日志輸出的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n           

四、springboot之web開發

1、簡介

建立SpringBoot應用,選中我們需要的子產品,SpringBoot已經預設将這些場景配置好了,隻需要在配置檔案中指定少量配置就可以運作起來, 自己編寫業務代碼即可快速搭建web項目

2、如何看是否已自動配置

這個場景SpringBoot幫我們配置了什麼?能不能修改?能修改哪些配置?能不能擴充?
xxxxAutoConfiguration:幫我們給容器中自動配置元件;           

xxxxProperties:配置類來封裝配置檔案的内容;

3、SpringBoot對靜态資源的映射規則

1、所有 /webjars/** ,都去 classpath:/META-INF/resources/webjars/ 找資源;

以jar包的方式引入靜态資源,webjar的方式(

webjar官網

<!--引入jquery-webjar-->在通路的時候隻需要寫webjars下面資源的名稱即可
        <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>jquery</artifactId>
            <version>3.3.1</version>
        </dependency>           

2、"/**" 通路目前項目的任何資源,都去(靜态資源的檔案夾)找映射

"classpath:/META-INF/resources/", 
"classpath:/resources/",
"classpath:/static/", 
"classpath:/public/" 
"/":目前項目的根路徑           

3、歡迎頁; 靜态資源檔案夾下的所有index.html頁面;被"/**"映射;

4、網站的圖示:所有的 **/favicon.ico 都是在靜态資源檔案下找

4、模闆引擎

模闆引擎就是類似我們鼠疫的jsp頁面可以嵌入動态的java代碼,常見的模闆引擎有JSP、Velocity、Freemarker、Thymeleaf,而SpringBoot推薦的Thymeleaf,文法更簡單,功能更強大

1、引入thymeleaf

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
              2.1.6
        </dependency>
切換thymeleaf版本
<properties>
        <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
        <!-- 布局功能的支援程式  thymeleaf3主程式  layout2以上版本 -->
        <!-- thymeleaf2   layout1-->
        <thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>
  </properties>           

2、Thymeleaf使用

隻要我們把HTML頁面放在classpath:/templates/,thymeleaf就能自動渲染

使用:

1、導入thymeleaf的名稱空間

<html lang="en" xmlns:th="http://www.thymeleaf.org">           

2、使用thymeleaf文法;

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>成功!</h1>
    <!--th:text 将div裡面的文本内容設定為 -->
    <div th:text="${hello}">這是顯示歡迎資訊</div>
</body>
</html>           

3、文法規則

springboot系列知識

5、擴充SpringMVC自動配置

<mvc:view-controller path="/hello" view-name="success"/>
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/hello"/>
            <bean></bean>
        </mvc:interceptor>
    </mvc:interceptors>           

==編寫一個配置類(@Configuration),是WebMvcConfigurerAdapter類型;不能标注@EnableWebMvc==;

既保留了所有的自動配置,也能用我們擴充的配置;

//使用WebMvcConfigurerAdapter可以來擴充SpringMVC的功能
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
       // super.addViewControllers(registry);
        //浏覽器發送 /atguigu 請求來到 success
        registry.addViewController("/atguigu").setViewName("success");
    }
}           

6、如何修改SpringBoot的預設配置

模式:

​ 1)、SpringBoot在自動配置很多元件的時候,先看容器中有沒有使用者自己配置的(@Bean、@Component)如果有就用使用者配置的,如果沒有,才自動配置;如果有些元件可以有多個(ViewResolver)将使用者配置的和自己預設的組合起來;

​ 2)、在SpringBoot中會有非常多的xxxConfigurer幫助我們進行擴充配置

​ 3)、在SpringBoot中會有很多的xxxCustomizer幫助我們進行定制配置