springboot学习笔记(连载)1.SpringB

1. SpringBoot配置

1.1 配置文件

SpringBoot使用一个全局的配置文件,配置文件名是固定的:

  • application.properties
  • application.yml

配置文件的作用:修改springboot自动配置的默认值;

标记语言:

以前的配置文件,大多使用xml配置文件
YAML:以数据为中心,比json和xml更适合做配置文件
复制代码
// yml
server:
    port: 8081
复制代码

1.2 YAML语法

  1. 基本语法
  • key: value 表示一对键值对
  • 空格的缩进控制层级关系
  • 属性和值也是大小写敏感
  1. 值的写法
  • 字面量:普通的值(数字,字符串,布尔)
    • k: v;
    • 字符串默认不用加上引号;
    • "" 不会转义字符串里面的特殊字符,特殊字符会作为本身想表示的意思
    • '' 会转义特殊字符,特殊字符最终只是一个普通的字符串数据
  • 对象(属性和值)(键值对)
    • 对象还是k:v的方式
    • 注意缩进
friends:
    lastName: zhangsan
    age: 20
复制代码
  • 数组(List,Set)

用- 值得方式表示数组中的一个元素

pets:
    - cat
    - dog
    - pig
    
// 行内写法:
pets: [cat,dog,pig]
复制代码

1.3 配置文件值注入

// yml
person:
    latName: hello
    age: 18
    boss: false
    maps:{k1: v1,k2: v2}
    lists:
        - dog
        - cat 

// Person.java

/**
* 将配置文件中配置的每一个属性的值,映射到这个组件中
* ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
* prefix="person": 配置文件中哪个下面的所有属性进行一一映射
* 
* 只有这个组件是在容器中的组件,才能容器提供的@ConfigurationProperties功能
*/
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String lastName;
    private Integer age;
    private Boolean boss;
    private Map<String,Object> maps;
    private List<Object> lists;
    
    // getter setter略
}

复制代码

1.4 @Configuration和@Value区别

// Person.java

@Component
//@ConfigurationProperties(prefix = "person")
public class Person {
    @Value("${person.lastName}")
    private String lastName;
    @Value("#{11*2}")
    private Integer age;

    @Value("true")
    private Boolean boss;
    private Map<String,Object> maps;
    private List<Object> lists;

    // getter setter略

    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 Map<String, Object> getMaps() {
        return maps;
    }

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

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    @Override
    public String toString() {
        return "Person{" +
                "lastName='" + lastName + ''' +
                ", age=" + age +
                ", boss=" + boss +
                ", maps=" + maps +
                ", lists=" + lists +
                '}';
    }
}

// test.java

@SpringBootTest
class Springboot01HelloworldQuickApplicationTests {

    @Autowired
    Person person;

    @Test
    public void contextLoads() {
        System.out.println(person);
    }

}


// >>> Person{lastName='hello', age=22, boss=true, maps=null, lists=null}

复制代码
@ConfigurationProperties @Value
功能 批量注入配置文件的属性 一个个指定
松散语法 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持
复杂类型 支持 不支持

如果说我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value。

如果说我们专门编写一个javaBean来和配置文件映射,我们就直接使用@ConfigurationProperties

1.5 其他配置注解

@PropertySource(value = {"classpath:person.properties"})
加载指定路径的资源

@ImportSource(locations = {"classpath:beans.xml"})
导入Spring的配置文件,让配置文件的内容生效。

// 实际开发中,我们尽量不用配置文件,尽量使用配置类

// MyConfig.java
@Configuration
public class MyConfig {
    // @Bean将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名
    @Bean
    public String helloService(){
        return "HelloService";
    }
}


// test.java
@SpringBootTest
class Springboot01HelloworldQuickApplicationTests {

    @Autowired
    Person person;

    @Autowired
    ApplicationContext ioc;

    @Test
    public void testHelloService(){
        Boolean b = ioc.containsBean("helloService");
        System.out.println(b);
    }

    @Test
    public void contextLoads() {
        System.out.println(person);
    }

}
复制代码

1.6 Profile多环境支持

多文件

主配置文件命名:application-{profile}.properties/yml

yml支持多文档块的方式

激活指定profile

  1. 在配置文件中指定 spring.profiles.active = dev
  2. 命令行方式 --spring.profile.active = dev; 可以在idea的Configuration中Program arguments中添加。

1.7 配置文件加载位置

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

以上按照优先级从高到低的顺序,所有位置的文件都被加载,高优先级配置内容会覆盖低优先级的配置内容

2. SpringBoot与日志

2.1 日志框架

日志门面(日志的抽象层) 日志实现
JCL、SLF4j、jboss-logging Log4j、JUL、Log4j2、Logback

左边选一个门面,右边选一个实现

日志门面:jboss-logging一般不用,JCL最近不更新了,所以只用SLF4j

日志实现:首选Logback

springboot选用SLF4j和logback

2.2 SLF4j使用

2.2.1 如何在系统中使用

以后开发的时候,日志记录方法的调用,不应该调用日志的实现类,而应该调用日志抽象层里面的方法;

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");
  }
}
复制代码

3. web开发

使用springboot:

  1. 创建SpringBoot应用,选中我们需要的模块
  2. SpringBoot默认把这些场景配置好了,只需要在配置文件中指定少量配置就可以运行起来
  3. 自己编写业务代码

3.1 自动配置原理:

这个场景SpringBoot帮我们配置了什么?能不能修改?能修改哪些配置?能不能扩展?

***AutoConfigruation:帮我们给容器中自动配置组件

***Properties:配置类来封装配置文件中的内容

3.2 静态资源映射规则

  1. 所有/webjars/**,都去classpath:META-INF/resources/webjars/ 找资源