SpringBoot(01)工程搭建和yml

75 阅读2分钟

一、构建最初的工程

1. 用Spring初始化工具搭建SpringBoot工程

springboot001.png

2023-3-15-002.png

2. 编写pom.xml文件

<?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>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
    </parent>

    <groupId>com.fzj</groupId>
    <artifactId>smp</artifactId>
    <version>1.0</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <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>

pom文件上右键,将此工程以maven形式打开

注:不要忘记重要的两步:

  • IDEA的编码方式改为UTF-8
  • Maven的地址改为正确的地址
    • 目录地址
    • config地址
    • 仓库地址

3. 运行启动类

出现以下信息,说明构建成功

2023-03-17 22:57:10.242  INFO 4368 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2023-03-17 22:57:10.251  INFO 4368 --- [           main] com.ssp.SmpApplication                   : Started SmpApplication in 1.121 seconds (JVM running for 2.696)

4. 关于启动类

@SpringBootApplication
public class SmpApplication {
    public static void main(String[] args) {
        SpringApplication.run(SmpApplication.class, args);
    }
}
  • SpringBoot的启动类是其执行入口,运行main方法即可启动项目。
  • SpringBoot运行后会初始化Spring容器,扫描启动类所在的包,并加载Bean

二、yml配置

1. SpringBoot提供了三种配置方式:

  • properties (默认方式) [ 加载优先级:最高 ]
  • yml (主流方式)
  • yaml [ 加载优先级:最低 ]
  • 不同配置文件中==相同==的配置按照 [ 加载优先级 ] 相互覆盖
  • 不同配置文件中的==不同==配置全部保留

2. yml语法规则

  • 大小写敏感
  • 属性层级关系使用多行描述,每行属性结尾以冒号结束
  • 使用缩进表示层级关系,同层级左侧对齐,只允许空格(禁Tab键)
  • 属性名和属性值之间以冒号空格相隔
  • 注释以#开头

示例:

lesson: Springboot

server:
  port: 81

user:
  name: messi
  age: 33
  team:
    - 巴塞罗那
    - 大巴黎

# 在配置文件中,可以使用 ${属性名} 方式引用属性值
baseDir: /usr/local/study
center:
  dataDir: ${baseDir}/data

# 如果属性中出现特殊字符,可以使用双引号包裹起来作为字符的解析
title: "spring\tboot\nstudy"

3.yml属性的读取

1. 用@Value()读取单个数据,属性名引用方式:${一级属性名.二级属性名}

@RestController
@RequestMapping("/book")
public class BookController {

    @Value("${lesson}")
    private String lesson;

    @Value("${server.port}")
    private int port;

    @Value("${user.team[1]}")
    private String team_01;

    @GetMapping
    public void test(){
        System.out.println("lesson: " + lesson);
        System.out.println("port: " + port);
        System.out.println("team_01: " + team_01);
    }
}

运行结果:

lesson: Springboot
port: 81
team_01: 大巴黎

注意:@Value不能获取整个数组的值

如:

@Value("${user.team}")
private String[] team;

会抛出异常:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'user.team' in value "${user.team}"

即:非法参数异常 抛出的异常表明向方法传递了一个不合法或不正确的参数

2. 封装全部数据到Environment对象

// 封装到Environment 兑现
@Autowired
    private Environment environment;

// 使用
@GetMapping
public void test(){
  System.out.println("lesson: " + environment.getProperty("lesson"));
  System.out.println("port: " + environment.getProperty("server.port"));
  System.out.println("team_01: " + environment.getProperty("user.team[1]"));
}

3. 自定义对象封装指定数据

@Component
@ConfigurationProperties(prefix ="user" )
public class User {
    private String name;
    private int age;
    private String[] team;
    
    // getter/setter
}

使用:

@RestController
@RequestMapping("/book")
public class BookController {

    @Autowired
    private User user;

    @GetMapping
    public void test(){
        System.out.println("user: " + user);
    }
}