springboot 尚桂谷学习总结02

Posted lixuchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot 尚桂谷学习总结02相关的知识,希望对你有一定的参考价值。

------向导快速创建Springboot 项目------

  1.使用spring initializer 快速创建一个springboot 项目

技术分享图片

技术分享图片

技术分享图片

  选择后 最后点击finsh 向导会联网创建 spring boot 项目

  自动生成的 pom 文件

 

<?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.lixuchun</groupId>
    <artifactId>spring-boot-01-helloworld-quick</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>spring-boot-01-helloworld-quick</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- springboot 单元测试模块 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    
</project>

 

  主程序也会自动生成 我们只需要编写自己逻辑就好了

技术分享图片

  resources 文件夹 自动生成

    static 静态资源文件 js css images

    templates : 保存所有末班页面 (spring boot 默认jar包使用嵌入式的tomcat 默认不支持jsp 页面) 可以

              使用模板引擎 freemarker thymleaf

   application.properties : springboot 应用的配置文件 可以做一些默认的设置的修改

 技术分享图片

  

------spring boot 文件的配置------

  1.配置文件, 配置文件的名称是固定的

    application.properties

    application.yaml

    配置文件的作用 :修改spring boot 的默认配置, 因为springboot 初始化都给我们配置好了

 

    YAML :是一个标记语言

    标记语言:

      之前配置文件是以xxx.xml 为配置文件

      ymal 以数据为中心 更适合做配置文件 更加简洁 

    eg : 启动端口为 8081 

技术分享图片

  2.YAML 语法

  基本语法:

    k: v    : 表示已对键值对(空格必须有)

    以空格缩进控制层级关系 : 只要左对齐数据 都是一个层级的

  server:

    port:8081

    path: /hello

    属性值是大小写敏感的

  值的写法:

    字面量 :普通的值 (数字 字符串 布尔)

      k: v ---》 直接写 不需要单引号 双引号

      "":双引号---》不会转义字符串里面特殊的字符

        name: "zhangsan \\n lisi" ---》 输出 zhangsan 换行 lisi

      ‘’:单引号 ---》会转义特殊字符 特殊字符最终只会是一个普通的字符串

        name: ‘zhangsan \\n lisi‘ ---》 输出 zhangsan \\n lisi

    对象,Map(属性和  值) (键值对)

     技术分享图片

     数组 (list set)

     技术分享图片

   yaml 练习实例:

技术分享图片

  创建 dog person 类: Alt + Insert 可以进行set get toString 等方法设定 

package com.lixuchun.springboot.com.lixuchun.springboot.bean;

public class Dog {
    private String name;
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name=‘" + name + ‘\\‘‘ +
                ", age=‘" + age + ‘\\‘‘ +
                ‘}‘;
    }
}

  person 类: @Component 将 Person 加入到容器当中 否则 ConfigurationProperties 不好用

package com.lixuchun.springboot.com.lixuchun.springboot.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;

/**
 * 將配置文件中的每一個屬性值映射到這個組件中
 * @ConfigurationProperties: 告訴springboot中所有屬性和配置文件進行綁定
 *      prefix = "person"C
 *      只有組件是容器中的組件 才能容器提供@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> list;
    private Dog dog;

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getList() {
        return list;
    }

    public void setList(List<Object> list) {
        this.list = list;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName=‘" + lastName + ‘\\‘‘ +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", list=" + list +
                ", dog=" + dog +
                ‘}‘;
    }
}

  yml 文件内容如下:

server:
  port: 8081

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

 

  测试类如下:最后yml文件内容成功注入到 bean中

技术分享图片

   总结配置文件值注入:

    @Component

    @ConfigureationProperties(prefix="person")

    这样就可以把配置文件内容注入进来了(注意:类必须成为spring容器中的组件才注入,所以必须加 @Component

    可以导入配置文件处理器,以后编写配置文件就有提示了

     <!-- 導入配置文件有提示 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

  配置properties文件的编码问题

  1.编辑properties文件

  技术分享图片

  再次运行测试类:中文出现乱码问题

  技术分享图片

  解决办法:

    idea 设置默认使用 utf-8

    properties 文件默认设置 assci

    技术分享图片

  

  [email protected] 获取配置文件值 和 @ConfigurationProperties 获取值比较

  @ConfigurationProperties 是从全局配置文件中读取内容技术分享图片

   类上有@Validate 属性可以进行校验 如 @Email 属性必须是邮件格式的值

@Component
@ConfigurationProperties(prefix = "person")
@Validated
public class Person {

    //@Value("${person.last-name}")
    @Email
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;

  如果说我们只是获取配置文件中的某一项简单类型 string int 值就用@Value 

  如果说专门编写了一个javaBean来和配置文件进行映射,使用@ConfigurationProperties

 

  3. @PropertySource && @ImportResource  

    @PropertySource 加载指定的配置文件

      @PropertySource(value = {"classpath:person.properties"})

    @ImportResource :导入spring 的配置文件 让配置内容生效

    新建一个service 并且新建一个 beans.xml 将 service 注入进去

    在test测试一下 ioc容器中是否包含了这个bean

技术分享图片

 技术分享图片

    结果 false 发现并不包含 说明没有注入进去:

    如果想加入到ioc容器中 则加上 @ImportResource(locations={"classpath:beans.xml"})

    加到 主配置类上 再次运行 则注入到ioc容器中了

    spring boot 不推荐 xml 配置的方式

  spring boot 推荐给容器中添加组件方式:全部使用注解进行配置

  eg:

package com.lixuchun.springboot.config;

import com.lixuchun.springboot.com.lixuchun.springboot.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 注明当前类是一个配置类 就是替代之前的spring配置文件
 * 在 配置文件中 <bean></bean> 标签组件
 */
@Configuration
public class MyAppConfig {

    /**
     * 将方法的返回值加载到容器中 容器中id 默认就是方法名称
     * @return
     */
    @Bean
    public HelloService helloService() {
        System.out.println("给容器中添加组件了!");
        return new HelloService();
    }
}

  

  占位符:

技术分享图片

  4. profile

    1.多profile 文件,创建多个profile文件app-dev, app-pro。。。。。。

      我们在编辑配置文件的时候文件名称可以是 : application-{profile}.propeties/ yml

      默认使用 application.properties 配置文件

     

    2.yml 支持多文档块模式,下面分成三块 并且激活第一块

  技术分享图片

    3. 激活指定的profile 文件

      1.在指定配置文件中指定激活配置文件: spring.profiles.active=dev

        则 application-dev.properties 配置文件生效

       2.可以使用命令行方式激活指定文件:

        --spring.profile.active=dev 下面图中 通过1,2配置 虽然 yml 配置文件中 prod生效

        但是由于 命令行则是dev 块生效

技术分享图片

   也可以通过maven打包后 java -jar 命令进行配置

技术分享图片

  也可以通过虚拟机参数进行设置:-Dspring-profiles.active=dev

技术分享图片

 

  spring boot 配置文件的加载位置:file:./ 此目录为 项目跟目录 和 src 目录评级

  spring boot 会从四个位置全部加载配置文件: 互补配置 有高用高 没有用低

技术分享图片

  在项目打包后需要 使用命令行参数形式 启动项目的时候指定配置文件位置 指定的配置文件和

  默认的配置文件会起到互补的作用

技术分享图片

   

技术分享图片

   

  外部配置文件加载:按照优先级从高到低:高优先级的配置覆盖低优先级配置 互补配置

技术分享图片

  由jar包外向jar包内进行寻找,有限寻找带 profile的配置文件[jar propertis文件和jar包同目录]

  启动项目会直接加载 application.properties 文件

 技术分享图片

   

------自动配置原理------

  配置文件可以写什么 如何写 自动配置原理:

  1.spring boot 启动时候 加载主配置类 开启了自动配置功能@EnableAutoConfiguration

技术分享图片

  每个xxxAutoConfiguration类都是容器的一个组件,都加入到容器中。用来做自动化配置

  以HttpEncodingAutoConfiguration 为例进行解析:

技术分享图片

  精髓

技术分享图片  

   @Conditional 自动配置

  1. @Conditional 派生注解 (spring 注解版原生的 @Conditional 作用)

 技术分享图片

  自动配置类必须在一定的条件下才能生效,加载了很多的配置 但是生效的话还要自己配置

  比如导入pom jar包等

  如何查看哪些配置类生效了: debug=true

  技术分享图片

  然后启动可以看控制台哪些自动装配了

技术分享图片

   Negtive matches: 没有启用的自动装配

   

  上一篇:springboot 尚桂谷学习笔记01

  下一篇:springboot 尚桂谷学习笔记03

 

以上是关于springboot 尚桂谷学习总结02的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 尚桂谷学习笔记06 ---Web

学习小片段——springboot 错误处理

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

Python学习总结

Spring boot:thymeleaf 没有正确渲染片段

线程学习知识点总结