五、Spring Boot - 上手篇(1)

Spring Boot 涉及底层核心源码,建议先看上手篇

一、快速入门:创建第一个SpringBoot 工程

前提电脑安装了jdk,maven并且在IDEA中作了配置

1.1 点击File—>New—>Project…

创建可以参考 Spring Boot

创建SpringBoot时候报错解决,------------------------- 官网创建下载导入地址

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

输入maven属性,注意Artifact不要出现大写、特殊字符.

1.2 选择版本和依赖的相关骨架包

选择SpringBoot版本,选择项目需要依赖的相关骨架包

注意:一定要选择springBoot版本2.1.9(没有的话选择低版本,下面手动改)

在这里插入图片描述

1.3 设置项目保存目录

在这里插入图片描述

1.4 项目创建完成,工程主界面如下

在这里插入图片描述

手动修改版本:

在这里插入图片描述

1.5 项目说明

  • (1)默认有个DemoApplication类,里面是spring boot的载入函数
  • (2)resource目录下有个application.properties文件,这个是Spring boot的配置文件
  • (3)test目录下有个测试类DemoApplicationTests,这个是spring boot的单元测试
  • (4)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 https://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.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!-- Generated by https://start.springboot.io -->
    <!-- 优质的 spring/boot/data/security/cloud 框架中文文档尽在 => https://springdoc.cn -->
    <groupId>com.gansu</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <url/>
    <licenses><license/></licenses>
    <developers><developer/></developers>
    <scm>
        <connection/>
        <developerConnection/>
        <tag/>
        <url/>
    </scm>
    <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>

注意观察

  • 一个继承spring-boot-starter-parent,

两个依赖,

  • spring-boot-starter-web web 项目依赖必须,
  • spring-boot-starter-test spring boot 项目单元测试依赖

注意,很多人配置的maven加速镜像,其中很多配置的阿里云maven镜像,在这会有找不到最新Springboot相关包的问题,也可以把加速镜像指向华为云:

2. Maven镜像配置

1.6 启动项目

通过spring boot的启动类,这里是DemoApplication,选中类,右键选择–>Run‘DemoApplication

在这里插入图片描述

在控制台出现如下输出:

在这里插入图片描述

找到如下文字,表明SpringBoot已经成功启动:

在这里插入图片描述

  • tomcat启动在8080端口,http协议,启动花费了3.184秒
    打开浏览器,输入地址:http://localhost:8080 ,出现如下画面

在这里插入图片描述

出现上图404错误是正常的,因为我们什么都没写。

1.7 编写 HelloController

在这里插入图片描述

注意HelloController所在包,必须在com.gansu.demo包,或者子包下面。

package com.gansu.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {

    @RequestMapping("/hello")
    @ResponseBody
    public String hello(){

        return "Hello Spring boot!!!";
    }
}

重启应用,看控制台输出:

重启发现刚才写的hello已经映射出来了
访问http://localhost:8080/hello

在这里插入图片描述

二、SpringBoot 基于web应用开发

2.1 SpringBoot json支持

(1)、创建实体bean Car

Lombok使用

  • 1、导入依赖库

在这里插入图片描述

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.6</version>
</dependency>
  • 2、安装插件

在这里插入图片描述

  • 3、在实体bean使用插件注解或直接生成
    @Data //get 、set
    @AllArgsConstructor //所有参数的有参数构造函数
    @NoArgsConstructor //无参数构造函数

在这里插入图片描述

package com.gansu.pojo;

import java.io.Serializable;



public class Car implements Serializable {

    private Integer id;
    private String name;
    private Float price;

    public Car() {
    }

    public Car(Integer id, String name, Float price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Float getPrice() {
        return price;
    }

    public void setPrice(Float price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Car{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                '}';
    }
}

(2)、创建Controller CarController

在这里插入图片描述

package com.gansu.controller;


import com.gansu.pojo.Car;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/car")
public class CarController {

    @RequestMapping("/findOne")
    public Car findOne(){

        Car car = new Car(1,"喵喵",23F);

        return car;
    }
}

说明:@RestController 注解,等于@Controller 与 @ResponseBody 一起使用

(3)、测试获取单个对象json

开启postman,设置发出get请求,请求地址:

http://localhost:8080/car/findOne

在这里插入图片描述

在这里插入图片描述

(4)、修改Controller CarController新增返回list集合方法

在这里插入图片描述

@RequestMapping("/getAllCar")
public List<Car> getAllCar(){

   ArrayList list = new ArrayList();

   Car car1 = new Car(1,"喵喵1",231F);
   Car car2 = new Car(2,"喵喵2",232F);
   Car car3 = new Car(3,"喵喵3",233F);
   Car car4 = new Car(4,"喵喵4",234F);
   Car car5 = new Car(5,"喵喵5",235F);
   Car car6 = new Car(6,"喵喵6",236F);

   list.add(car1);
   list.add(car2);
   list.add(car3);
   list.add(car4);
   list.add(car5);
   list.add(car6);

   return list;
}

(5)、测试获取集合多个对象json

开启postman,设置发出get请求,请求地址:http://localhost:8080/car/getAllCar

在这里插入图片描述

在这里插入图片描述

2.2 SpringBoot 请求传递参数

2.1.1 第一类:请求路径传参

@PathVariable 获取路径参数。即url/{id} 这种形式
@RequestParam 获取查询参数。即url?name=value 这种形式

(1)、修改Controller CarController新增接收参数,返回单个对象方法

在这里插入图片描述

@RequestMapping("/getCarById/{id}")
public Car geteCarById(@PathVariable("id") Integer id, @RequestParam("name") String name){

    Car car = new Car();

    car.setId(id);
    car.setName(name);
    car.setPrice(999.9f);
    return car;
}

(2)、测试传递参数获取单个对象json

在这里插入图片描述

2.1.2 第二类:@RequestBody 参数

(3)、修改Controller CarController新增接收封装对象参数,返回单个及多个对象方法

在这里插入图片描述

@RequestMapping("/getCar")
public Car getCar(Car car){

    return car;
}

(6)、测试传递普通body参数获取单个对象json

开启postman,设置发出post请求,请求地址:
http://localhost:8080/car/getCar

请求参数,选择body

在这里插入图片描述

2.3 SpringBoot 静态资源

2.3.1 默认静态资源映射

Spring Boot 对静态资源映射提供了默认配置
Spring Boot 默认将 /** 所有访问映射到以下目录:

  • classpath:/static
  • classpath:/public
  • classpath:/resources
  • classpath:/META-INF/resources
    如:在resources目录下新建 publicresourcesstatic 三个目录,并分别放入 a.jpg b.jpg c.jpg 图片

图片素材:👇👇

在这里插入图片描述

在这里插入图片描述

浏览器分别访问:

  • http://localhost:8080/a.jpg
  • http://localhost:8080/b.jpg
  • http://localhost:8080/c.jpg

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

均能正常访问相应的图片资源。那么说明,Spring Boot 默认会挨个从 public resources static 里面找是否存在相应的资源,如果有则直接返回。

2.3.2 自定义静态资源访问

试想这样一种情况:一个网站有文件上传文件的功能,如果被上传的文件放在上述的那些文件夹中会有怎样的后果?
网站数据与程序代码不能有效分离;当项目被打包成一个.jar文件部署时,再将上传的文件放到这个.jar文件中是有多么低的效率;网站数据的备份将会很痛苦。此时可能最佳的解决办法是将静态资源路径设置到磁盘的基本个目录。

第一种方式

  • 1、配置类

在这里插入图片描述

package com.gansu.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/myPic/**")
                .addResourceLocations("file:D:\\develop\\ideaIU-2018.2.5\\ideaIU-2018.2.5\\idea_workspace\\pic\\");
    }
}

上面的意思就是:将所有D:\develop\ideaIU-2018.2.5\ideaIU-2018.2.5\idea_workspace\pic\ 访问都映射到/myPic/** 路径下

2、重启项目
例如,在D:\develop\ideaIU-2018.2.5\ideaIU-2018.2.5\idea_workspace\pic\中有一张a.jpg图片

在这里插入图片描述

在浏览器输入:http://localhost:8080/myPic/a.jpg即可访问。

在这里插入图片描述

第二种方式

首先,我们配置application.properties

web.upload-path=D:/develop/ideaIU-2018.2.5/ideaIU-2018.2.5/idea_workspace/pic/
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,\
classpath:/static/,classpath:/public/,file:${web.upload-path}

注意:
web.upload-path:这个属于自定义的属性,指定了一个路径,注意要以/结尾;
spring.mvc.static-path-pattern=/**:表示所有的访问都经过静态资源路径;
spring.resources.static-locations:在这里配置静态资源路径,前面说了这里的配置是覆盖默认配置,所以需要将默认的也加上否则static、public等这些路径将不能被当作静态资源路径,在这个最末尾的file:${web.upload-path}之所有要加file:是因为指定的是一个具体的硬盘路径,其他的使用classpath指的是系统环境变量。

然后,重启项目
例如,在D:/develop/ideaIU-2018.2.5/ideaIU-2018.2.5/idea_workspace/pic/中有一张a.jpg图片

在浏览器输入:http://localhost:8080/a.jpg 即可访问。

在这里插入图片描述

三、SpringBoot 属性配置

Spring Boot并不真正是所谓的『零配置』,他的理念是“习惯优于配置”采用了一些默认的习惯性配置,让你无需手动进行配置,从而让你的项目快速运行起来。所以要想玩转Spring Boot,了解这些默认配置还是必不可少的。

3.1 项目默认属性配置文件所在位置及配置实例

创建Spring Boot项目时,会默认生成一个全局配置文件application.properties(可以修改后缀为.yml),在src/main/resources目录下或者类路径的/config下。我们可以通过修改该配置文件来对一些默认配置的配置值进行修改。

在这里插入图片描述

【修改默认配置】

  • 1、spring boot 开发web应用的时候,默认tomcat的启动端口为8080,如果需要修改默认的端口,则需要在application.yml添加以下记录:
server:
  port: 8081

重启项目,启动日志可以看到:Tomcat started on port(s): 8081 (http) 启动端口为8081 ,浏览器中访问 http://localhost:8081 能正常访问。

在这里插入图片描述

在这里插入图片描述

  • 2、spring boot 开发web应用的时候,访问路径为 /,如果需要修改访问路径,则需要在application.yml添加以下记录:

在这里插入图片描述

server:
  port: 8081
  servlet:
    context-path: /demo

重启项目,启动日志就可以看到:Tomcat started on port(s): 8081(http) with context path ‘/demo’,浏览器中访问 http://localhost:8081/demo/a.jpg能正常访问。

在这里插入图片描述

3.2 实体类属性赋值

当属性参数变多的时候,我们习惯创建一个实体,用实体来统一接收赋值这些属性。

(1)、定义配置文件

在这里插入图片描述

server:
  port: 8081
  servlet:
    context-path: /demo


UserBody:
  username: zhangsan
  password: 123
  age: 22
  birthday: 2024-7-27

spring:
  jackson:
    date-format: yyyy-MM-dd
    time-zone: GMT+8

(2)、创建实体类 UserBody

在这里插入图片描述

package com.gansu.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;

@Configuration
@ConfigurationProperties(prefix = "userbody")    //prefix 参数必须全部为小写
public class UserBody implements Serializable {

    private String username;
    private String password;
    private Integer age;

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;

    public UserBody() {
    }

    public UserBody(String username, String password, Integer age, Date birthday) {
        this.username = username;
        this.password = password;
        this.age = age;
        this.birthday = birthday;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getAge() {
        return age;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    @Override
    public String toString() {
        return "UserBody{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", age=" + age +
                ", birthday='" + birthday + '\'' +
                '}';
    }
}

需要在实体类上增加注解@ConfigurationProperties,并指定prefix前缀。prefix为全小写。

(3)、编写Controller调用属性bean

在这里插入图片描述

package com.gansu.controller;


import com.gansu.pojo.UserBody;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@EnableConfigurationProperties({UserBody.class})
public class UserBodyController {

    @Autowired
    UserBody userBody;
    @GetMapping("/getUser")
    public String getUser(){

        return userBody.toString();
    }
}

EnableConfigurationProperties注解需要加在调用类上,或者加在启动类SpringbootSimpleApplication上也可以。

访问地址:http://localhost:8081/demo/getUser

可以看到返回值:

在这里插入图片描述

3.3 自定义配置文件

application.yml是系统默认的配置文件,当然我们也可以创建自定义配置文件,在路径src/main/resources下面创建文件test.properties

注意:spring boot1.5 版本后@PropertySource注解就不能加载自定义的yml配置文件了

(1)、定义userBody.properties 删除或修改之前的yml,不然不生效

在这里插入图片描述

userbody.username=zhangsan88
userbody.password=12312388
userbody.age=228
userbody.birthday=2024-7-27

(2)、将配置赋值到 javabean

在这里插入图片描述

@PropertySource("classpath:userBody.properties")

@Configuration 注解包含@Component注解
1.5版本后需要通过@PropertySource(“classpath:userBody.properties”)指定配置文件

(3)、Controller 读取配置和上面一致

访问地址:http://localhost:8080/getUser 可以看到返回值:

在这里插入图片描述

3.4 多环境配置文件

使用多个yml配置文件进行配置属性文件
可以使用多个yml来配置属性,将与环境无关的属性放置到application.yml文件里面;通过与配置文件相同的命名规范,创建application-{profile}.yml文件 存放不同环境特有的配置,例如 application-test.yml 存放测试环境特有的配置属性,application-prod.yml 存放生产环境特有的配置属性。

通过这种形式来配置多个环境的属性文件,在application.yml文件里面spring.profiles.active=xxx来指定加载不同环境的配置,如果不指定,则默认只使用application.yml属性文件,不会加载其他的profiles的配置。

(1)、创建application-dev.yml

server:
  port: 8082
  servlet:
    context-path: /demo2

(2)、创建application-test.yml

server:
  port: 8083
  servlet:
    context-path: /demo3

(3)、创建application-prod.yml

server:
  port: 8084
  servlet:
    context-path: /demo4

(4)、修改application.yml

spring:
  profiles:
    active: prod

通过设置,active: 的值对应不同的{profile}就可以使对应的配置文件生效。

在这里插入图片描述

文章源码

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Daniel521-Spark

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值