SpringBoot學習筆記

2019年7月23日html

1.Spring Boot簡介java

  簡化Spring應用開發的一個框架jquery

  整個Spring技術棧的整合web

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

2.微服務json

  微服務:架構風格數組

  一個應用應該是一組小型服務;能夠經過HTTP方式進行互通緩存

  每個功能元素最終都是一個可獨立替換和獨立升級的軟件單元springboot

3.配置文件session

  做用:修改SpringBoot自動配置的默認值

  application.properties

  application.yml

  (1)yaml基本語法

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

    以空格的縮進來控制層級關係

    屬性和值大小寫敏感 

  (2)值得寫法

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

      k: v:字面直接來寫

        字符串默認不用加上單引號或者雙引號

        "":雙引號不會轉義字符串裏面的特殊字符,特殊字符會做爲自己想表示的意思

        '':單引號會轉義特殊字符,特殊字符最終只是一個普通的字符串數據

    對象、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)配置文件值注入

配置文件:application.yml

server:
    port: 8081

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

配置文件:application.properties

person.last-name=張三
person.age=18
person.birth=2017/12/15
person.boss=false
person.maps.k1=v1
person.maps.k2=14
person.lists=a,b,c
person.dog.name=dog
person.dog.age=15

javaBean:

/**
 * 將配置文件中每個屬性的值,映射到這個組件中
 * @ConfigurationProperties:告訴SpringBoot將本類中全部屬性和配置文件中相關的配置進行綁定
 *      prefix = "person":配置文件中哪一個下面的全部屬性進行一一映射
 * 只有這個組件是容器中的組件,才能使用容器提供的@ConfigurationProperties功能
* @ConfigurationProperties(prefix = "person")默認從全局配置文件中獲取值
*/ @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>

@ConfigurationProperties獲取配置文件值

@Component
@ConfigurationProperties(prefix = "person")

@Value獲取文件值

public class Person {
    
    @Value("${person.last-name}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;
    @Value("true")
    private Boolean boss;
    private Date birth;

  (4)@PropertySource&@ImportResource

  @PropertySource:加載指定的配置文件

@PropertySource(value = {"classpath:***.properties"})
@Component
@ConfigurationProperties(prefix = "person")
public class Person {

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

  @ImportResource:導入Spring的配置文件,讓配置文件裏面的內容生效

  Spring Boot裏面沒有Spring的配置文件,咱們本身編寫的配置文件,也不能自動識別

@ImportResource({"classpath:***.xml"})

  (5)Spring推薦使用@Bean給容器添加組件

/**
 * @Configuration:指明當前類是一個配置類,用來替代Spring配置文件
 */
@Configuration
public class MyAppConfig {

    //將方法的返回值添加到容器中:容器中這個組件默認的id就是方法名
    @Bean
    public HelloService helloService(){
        return  new HelloService();
    }
}

 2019年7月24日

1.配置文件佔位符

  (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.last-name:name}_dog
person.dog.age=15

2.Profile

Profile是Spring對不一樣環境提供不一樣配置功能的支持,能夠經過激活、指定參數等方式快速切換環境

  (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

  • 在配置文件中指定spring.profile.active=***
  • Run/Debug Configurations-->Program arguments:--spring.profiles.active=***
  • 打包後經過命令行的方式運行:java -jar ***.jar --spring.profiles.active=***
  • 虛擬機參數:Run/Debug Configurations-->VM options:--Dspring.profiles.active=***

 3.配置文件加載位置

Spring Boot啓動會掃描如下位置的application.properties或者application.yml文件做爲Spring Boot的默認配置文件

  • file:./config/
  • file:./
  • classpath:/config
  • classpath:/

以上按照優先級從高到低的順序,全部位置的文件都會被加載,高優先級配置內容會覆蓋低優先級配置內容

還能夠經過spring.config.location來改變默認的配置文件的位置

項目打包好之後,咱們可使用命令行參數的形式,啓動項目的時候來指定配置文件的新位置;指定配置文件和默認加載的配置文件共同起做用造成配置互補

4.外部配置加載順序

SpringBoot也能夠從如下位置加載配置;優先級從高到低;高優先級的配置覆蓋低優先級的配置,全部的配置會造成互補配置

  • 命令行參數

    java -jar ***.jar -server.port=**** -server.context.path=/***

  • 來自java:comp/env的NDI屬性
  • java系統屬性(System.getProperties())
  • 操做系統環境變量
  • RandomValuePropertySource配置的random.*屬性
  • jar包外部的application-{profile}.properties/yml配置文件
  • jar包內部的application-{profile}.properties/yml配置文件
  • jar包外部的application.properties/yml配置文件
  • jar包內部的application.properties/yml配置文件
  • @Configuration註解類上的@PropertySource
  • 經過SpringApplication.setDefaultProperties指定的默認屬性

5.自動配置原理

  (1)SpringBoot啓動的時候加載主配置類,開啓了自動配置功能@EnableAutoConfiguration

  (2)@EnableAutoConfiguration做用:

  • 利用EnableAutoConfigurationImportSelector給容器中導入一些組件
  • List<String> configurations = getCandidateConfigurations(annotationMetadata,attribute);獲取候選配置
SpringFactoriesLoader.loadFactoryNames()
掃描全部jar包類路徑下    META-INF/spring.factories
把掃描到的這些文件內容包裝成properties對象
從properties中獲取到EnableAutoConfiguration.class類(類名)對應的值,而後填入到容器中

  (3)每個自動配置類進行自動配置功能

    ex:HttpEncodingAutoConfiguration

@Configuration    //表示這是一個配置類,能夠給容器添加組件
@EnableConfigurationProperties(HttpEncodingProperties.class)    //啓用指定類的ConfigurationProperties功能:將配置文件中對應的值和HttpEncodingProperties綁定起來
@ConditionalOnWebApplication    //判斷當前應用是不是web應用;Spring底層@Condition註解,若是知足指定的條件,整個配置類纔會生效
@ConditionalOnClass(CharacterEncodingFilter.class)   // 判斷當前項目有沒有這個類
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enable", matchIfMissing = true)    //判斷配置文件中是否存在某個配置;若是不存在,也是成立的
public class HttpEncodingAutoConfiguration {

根據當前不一樣的條件判斷,決定這個配置類是否生效;一但這個配置類生效,這個配置類就會給容器中添加各類組件;這些組件的屬性是從對應的properties類中獲取的,這些類裏面的每個屬性又和配置文件綁定

  (4)總結

  • SpringBoot啓動會加載大量的自動配置類
  • 咱們須要的功能有沒有SpringBoot默認寫好的自動配置類
  • 自動配置類包含哪些組件
  • 給自動配置類添加組件的時候,會從properties類中獲取某些屬性。咱們能夠在配置文件中指定這些屬性的值

6.SpringBoot日誌

SpringBoot選用SLF4j和logback實現記錄日誌

  (1)SLF4j

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

  (2)如何讓系統中全部的日誌都統一到slf4j:

    將系統中其餘日誌框架先排除

    用中間包來替換原有的日誌框架

    導入slf4j其餘的實現

  (3)日誌使用

    SpringBoot默認幫助咱們配置好了日誌

#日誌輸出級別設置
logging.level.com.mxj=trace

#不指定路徑在當前項目下生成springboot.log日誌
#能夠指定完整的路徑
logging.file=D:/***.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
日誌輸出格式:
    %d:表示日期時間
    %thread:表示線程名
    %-5level:從左顯示5個字符寬度
    %logger{50}:表示logger名字最長50個字符,不然按照句點分割
    %msg:日誌消息
    %n:換行符

   (4)切換日誌框架

  能夠按照slf4j的日誌適配圖,進行相關的切換

7.SpringBoot_Web開發

  (1)使用SpringBoot

  • 建立SpringBoot應用,選中咱們須要的模塊
  • SpringBoot已經將場景配置好,只需少許配置就能夠運行
  • 編寫業務代碼

  (2)自動配置原理

****AutoConfiguration:給容器自動配置組件
****Properties:配置類封裝配置文件的內容

   (3)SpringBoot對靜態資源的映射規則

@ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false)
public class ResourceProperties implements ResourceLoaderAware, InitializingBean {
  //能夠設置和靜態資源有關的參數,緩存時間
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            if (!this.resourceProperties.isAddMappings()) {
                logger.debug("Default resource handling disabled");
                return;
            }
            Integer cachePeriod = this.resourceProperties.getCachePeriod();
            if (!registry.hasMappingForPattern("/webjars/**")) {
                customizeResourceHandlerRegistration(registry
                        .addResourceHandler("/webjars/**")
                        .addResourceLocations("classpath:/META-INF/resources/webjars/")
                        .setCachePeriod(cachePeriod));
            }
            String staticPathPattern = this.mvcProperties.getStaticPathPattern();
            if (!registry.hasMappingForPattern(staticPathPattern)) {
                customizeResourceHandlerRegistration(
                        registry.addResourceHandler(staticPathPattern)
                                .addResourceLocations(
                                        this.resourceProperties.getStaticLocations())
                                .setCachePeriod(cachePeriod));
            }
        }
  • 全部/webjars/**,都去classpath:/META-INF/resources/webjars/找資源

    webjars:以jar包的方式引入靜態資源

<!--引入jquery-webjar-->在訪問時只需寫webjars下面資源的名字
        <dependency>
            <groupId>org.webjars.bower</groupId>
            <artifactId>jquery</artifactId>
            <version>3.4.1</version>
        </dependency>
  • "/**"訪問當前項目的任何資源(靜態資源的文件夾)
"classpath:/META-INF/resources/"
"classpath:/resources/"
"classpath:static/"
"classpath:/public/"
"/"當前項目的根路徑
  • 歡迎頁:靜態資源文件夾下的全部index.html頁面:被「/**」映射

    localhost:8080/ 找index頁面

  • 全部的**/favicon.ico都是在靜態資源文件下找

   (3)模板引擎——Thymeleaf

引入Thymeleaf

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!--切換thymeleaf版本-->
<thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
<!--佈局功能支持程序-->
<thymeleaf-layout-dialect.version>2.2.2</thymeleaf-layout-dialect.version>

Thymeleaf使用&語法

@ConfigurationProperties(prefix = "spring.thymeleaf")
public class ThymeleafProperties {

    private static final Charset DEFAULT_ENCODING = Charset.forName("UTF-8");

    private static final MimeType DEFAULT_CONTENT_TYPE = MimeType.valueOf("text/html");

    public static final String DEFAULT_PREFIX = "classpath:/templates/";

    public static final String DEFAULT_SUFFIX = ".html";

//只要咱們把HTML頁面放在classpath:/templates/文件夾下,thymeleaf就能自動渲染

使用:

  • 導入thymeleaf的名稱空間
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  • 使用thymeleaf語法
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!--th:text 設置div裏面的文本內容-->
    <div th:text="${hello}">這裏顯示歡迎信息</div>
</body>
</html>
  • 語法規則

  (1)th : 任意html屬性,來替換原聲屬性的值

    片斷包含:th:insert th:replace

    遍歷: th:each

    條件判斷:th:if th:unless th:switch th:case

    聲明變量:th:object th:with

    任意屬性修改:th:attr th:attrprepend th:attrappend

    修改指定屬性默認值:th:value th:href th:src

    修改標籤體內容:th:text(轉義特殊字符) th:utext(不轉義特殊字符)

    聲明片斷:th:fragment th:remove

  (2)表達式語法

    ${...}:獲取變量值OGNL

      獲取對象的屬性、調用方法

      使用內置的基本對象:ctx vars locale request response session servletContext

    *{...}:和${...}在功能上是同樣的,配合th:object使用

    #{...}:獲取國際化內容

    @{...}:定義URL

    ~{...}:片斷引用表達式

  (3)內置的工具對象

example:

@Controller
public class HelloController {
    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
        return "Hello World";
    }

    @RequestMapping("/success")
    public String success(Map<String,Object> map){
        map.put("hello","<h1>你好</h1>");
        map.put("users", Arrays.asList("zhangsan","lisi","wangwu"));
        return "success";
    }
}
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--th:text 設置div裏面的文本內容-->
<div th:text="${hello}">這裏顯示歡迎信息</div>

<div th:text="${hello}"></div>
<div th:utext="${hello}"></div>
<hr/>

<!-- th:each每次遍歷都會生成當前標籤,3個h4-->
<h4 th:text="${user}" th:each="user:${users}"></h4>
<hr/>
<h4>
    <span th:text="${user}" th:each="user:${users}"></span>
</h4>
</body>
</html>

8.SpringBoot-SpringMVC自動配置

SpringBoot自動配置好了SpringMVC:

  • 自動配置了ViewResolver(視圖解析器:根據方法的返回值獲得視圖對象(View),視圖對象決定如何渲染(轉發?重定向?)

    ContentNegotiatingViewResolver:組合全部的視圖解析器

      如何定製:咱們能夠本身給容器中添加一個視圖解析器,自動將其組合進來

  • 靜態資源文件夾路徑
  • 靜態首頁訪問
  • 自動註冊Converter,GenericConverter,Formatter beans

    Converter:類型轉換器

    Formatter:格式化器

  • HttpMessageConverters:SpringMVC用來轉換Http請求和相應 User--json
  • 定義錯誤代碼生成規則
相關文章
相關標籤/搜索