栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

B站学习springboot笔记(1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

B站学习springboot笔记(1)

学习来源–>B站 传送门–> 【狂神说Java】SpringBoot最新教程IDEA版通俗易懂

文章目录
    • 1.第一个springboot程序
      • 1.1两种创建项目方式
        • 方式1:官方网站提供的自动开发网站方式
        • 方式2:直接使用IDEA自动集成的springboot,进行项目创建;
      • 1.2在配置文件`application.properties`中进行相关的配置
      • 1.3在`resources`目录下创建`banner.txt`文件,更改生成的标识;
    • 2.springboot的自动装配
      • 首先看看核心文件POM.XML
      • 关于启动器;
      • 关于启动的主程序
    • 3.主要启动程序的运行过程
    • 4.yaml配置文件的基本语法
      • 为属性赋值的几种方式
        • 方式1::直接用注解赋值
        • 方式2:在yaml配置文件中赋值;
        • 方式3:使用之前的`application.properties` 文件进行配置
        • 使用yaml配置文件时也可使用的表达式;
        • 使用yaml配置文件时,可 支持松散绑定
    • 5.不同位置的配置文件读取优先级
    • 6.多环境下的配置文件切换
      • 6.1 方式1:在`properties`文件下;使用`spring.profiles.active`切换
      • 6.2 方式2:在`yml`文件下使用`spring: profiles: active :`切换


springboot:javaweb的开发框架;基于 Spring 开发;约定大于配置;默认配置了很多框架的使用方式

1.第一个springboot程序

个人使用版本 ;
maven: 3.8.3
Javajdk 8版本
数据库->mysql8.0版本
tomcat:->9.0.48版本

1.1两种创建项目方式

有两种开发方式,

方式1:官方网站提供的自动开发网站方式

本次学习考虑使用2.5.6版本

首先;进入springboot官网—>https://spring.io/projects/spring-boot#overview

找到快速开发位置;

即–>https://start.spring.io/

进入页面后,简易选择相应的开发需求;下载即可;

下载到本地;

项目解压后

用IDEA打开项目文件夹;

生成的pom.xml配置文件



	4.0.0
	
	
		org.springframework.boot
		spring-boot-starter-parent
		2.5.6
		 
	
	
	com.xiaozhi
	demo
	0.0.1-SNAPSHOT
	myfirststudy
	Demo project for Spring Boot
	
		1.8
	
	
		
		
			org.springframework.boot
			spring-boot-starter-web
		
		
		
			org.springframework.boot
			spring-boot-starter-test
			test
		
	

	
		
			
			
				org.springframework.boot
				spring-boot-maven-plugin
			
		
	

启动项目试试;

可看到,实际是启动了8080端口的本地服务器;
在浏览器访问http://localhost:8080/

之前的项目模块创建时,都放在一个包下;

创建DemoController类,简易编写;

package com.xiaozhi.myfirststudy.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

//声明为控制层;
@RestController
public class DemoController {
    //请求;
    @RequestMapping("/demo")
    public String Demo(){
        return "demo";
    }
}

无需进行配置,这是底层自动装配的;
启动MyfirststudyApplication;

访问http://localhost:8080/demo


项目打包;使用maven的package命令打包项目为jar包;

这个jar包启动后即可直接使用;

方式2:直接使用IDEA自动集成的springboot,进行项目创建;

实际上,这样的开发方式还是类似于默认与官网的一样

1.

2.
设置对应的版本,项目名,描述,包名…等

3.
这一步,可以不选择依赖;之后自己可以去pom.xml文件配置;

4.

5.
删除这些目录及文件;

这样直接运行; 项目直接中断了,

还需要在pom.xml文件中添加配置,即导入web的依赖;


    org.springframework.boot
    spring-boot-starter-web

再次启动项目;即可运行;

测试使用;

在xiaozhi目录下创建controller目录,创建DemoController;

package com.xiaozhi.controller;

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

@Controller
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/test")
    @ResponseBody
    public String test(){
        return "testDemo01";
    }
}

访问http://localhost:8080/demo/test

1.2在配置文件application.properties中进行相关的配置

打开在resources目录下的application.properties的文件;

##更改服务端口
server.port=5277

再次启动时;端口已更新为5277

1.3在resources目录下创建banner.txt文件,更改生成的标识;
___   ___  __       ___       ______    ________   __    __   __  .______       _______   ___   
   /  / |  |     /        /  __    |       /  |  |  |  | |  | |   _       |   ____| / _   
   V  /  |  |    /  ^     |  |  |  | `---/  /   |  |__|  | |  | |  |_)  |    |  |__   | | | | 
  >   <   |  |   /  /_    |  |  |  |    /  /    |   __   | |  | |      /     |   __|  | | | | 
 /  .    |  |  /  _____   |  `--'  |   /  /----.|  |  |  | |  | |  |  ----.|  |____ | |_| | 
/__/ __ |__| /__/     __ ______/   /________||__|  |__| |__| | _| `._____||_______| ___/  

启动项目

2.springboot的自动装配 首先看看核心文件POM.XML

在它的核心配置文件pom.xml中,有显示它的父工程spring-boot-starter-parent

按住crtl,点进去;可看到它已经自动配置了资源文件的过滤配置操作;

它的父工程也存在一个上级父工程;spring-boot-dependencies
来管理所有的依赖配置;

同样地,按住ctrl键,点进去;可看到,它装配了各种依赖的属性资源,的默认版本号;

关于启动器;

比如说自动生成的这个依赖,都带有starter ;即可理解为启动器,而且这些依赖都不需要去写它的版本号;因为在他的父级的父级有默认的版本号定义.

启动器即自动的应用开发场景


	org.springframework.boot
	spring-boot-starter-web



	org.springframework.boot
	spring-boot-starter-test
	test

可以在官方文档2.5.6版本的api文档中,看看有哪些启动器;—>springboot–2.5.6的文档

关于启动的主程序

写在前面;(摘自<>中对于启动类的解释)
启动类是spring boot的入口,应用程序通过在类上设置一个启动类所在的包以及它的子包中的所有类的注解,并且将其加载到spring boot 的容器中进行管理,只需要在main( )方法中执行SpringApplication.run(SpringApplication.class, args),即完成了启动类的定义.

package com.xiaozhi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class XiaozhistudySpringboot01Application {

    public static void main(String[] args) {
        //主要启动处;
        SpringApplication.run(XiaozhistudySpringboot01Application.class, args);
    }
}

(1)找到这个注解@SpringBootApplication;点进去使用;

(2)找到注解@EnableAutoConfiguration;

(3)而注解``的定义中使用了注解@import({Registrar.class});引用注册类;

(4)对于自动装配选择类AutoConfigurationimportSelector;这里导入有多个选择的配置;

使用该方法,获取所有的配置;

List configurations = this.getCandidateConfigurations(annotationmetadata, attributes);

(5)这里使用的方法是getCandidateConfigurations();

protected List getCandidateConfigurations(Annotationmetadata metadata, AnnotationAttributes attributes) {
        List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in meta-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }

(6)调用方法getSpringFactoriesLoaderFactoryClass()时,内部是加载了EnableAutoConfiguration注解接口;
而这个注解@EnableAutoConfiguration又是被@SpringBootApplication注解所继承.

(7)根据提示的核心文件meta-INF/spring.factories;
在引用的jar包中查找;这个配置文件;

(8)自动装配的导入文件;

(9)刚才是根据提示配置文件查看,现在继续回到方法getCandidateConfigurations( );
找到其中的loadFactoryNames( )方法;

 public static List loadFactoryNames(Class factoryType, @Nullable ClassLoader classLoader) {
        //获取类加载器;
        ClassLoader classLoaderToUse = classLoader;
        if (classLoader == null) {
            //最终还是加载资源文件 meta-INF/spring.factories
            classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
        }

        String factoryTypeName = factoryType.getName();
        //加载资源文件;
        return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
    }

在配置文件spring.factories 中虽然自动导入装配了许多的配置包;
但是不一定都被应用过来了,那么就必须在pom.xml文件中进行配置启动包的坐标,才会被装配使用;

3.主要启动程序的运行过程
SpringApplication.run(XiaozhistudySpringboot01Application.class, args);

这一段需要分为两步
SpringApplication类 与 run( )方法.

run方法运行

SpringApplication类 的构造方法,

在启动时,首先会判断这是普通项目还是web项目;
然后查找并加载所有可用初始化器 , 设置到initializers属性;
找出所有的应用程序监听器,设置到listeners属性;
然后推断使用的当前类下的main方法,寻找运行的主类;
然后在为其装配spring相关的配置;

4.yaml配置文件的基本语法

之前使用application.properties的写法;

#配置修改端口;
server.port=3699
#单个数据
person = demo

#对象写法;
user.name=lzq
user.age=22

注意:properties配置文件在写中文的时候,会有乱码;可以设置为utf-8

application.yaml
而使用yaml文件的语法书写时,键值之间用冒号隔开,且赋值时需要在冒号后加空格;
而对于一个对象进行赋值时,需要层级之间的划分;

# 单个数据;冒号后加个空格;
person : iampeople

# 对象;注意层级;
user:
  name: lzq
  age: 22

# 行内写法;
 user: {name : lzq,age: 22}

#数组;
car:
  - baoma
  - aodi
  - dazhong

#数组行内写法
    car: [baoma,aodi,dazhong]
为属性赋值的几种方式 方式1::直接用注解赋值

先写个用户实体类

package com.xiaozhi.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


//使用注解,将它注入spring;
@Component
public class User {
    //直接用注解赋值;
    @Value("小智RE0")
    private String account;
    @Value("123456")
    private String password;

    //构造方法;
    public User() {

    }

    public User(String account, String password) {
        this.account = account;
        this.password = password;
    }

    //get,set;
    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

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

    //toString方法
    @Override
    public String toString() {
        return "User{" +
                "account='" + account + ''' +
                ", password='" + password + ''' +
                '}';
    }
}

在测试类中使用;

package com.xiaozhi;

import com.xiaozhi.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class StudySpringboot02ApplicationTests {

    //自动装配类;
    @Autowired
    private User user;

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

方式2:在yaml配置文件中赋值;

首先去pom.xml中配置文件处理依赖的jar坐标;然后,重启IDEA


    org.springframework.boot
    spring-boot-configuration-processor
    true

先写个汽车实体类

package com.xiaozhi.pojo;

import java.util.Date;
import java.util.List;
import java.util.Map;


 //注入spring容器
@Component
//配置读取配置文件 中car下的属性
@ConfigurationProperties(prefix = "car")
public class Car {
    //属性
    private String color;
    private String size;

    private Date start;
    private List lists;
    private Map maps;
    private Boolean good;

    //这里还用到了User用户对象;
    private User user;

    //构造方法;
    public Car() {

    }

    public Car(String color, String size, Date start, 
               List lists, Map maps, Boolean good, User user) {
        this.color = color;
        this.size = size;
        this.start = start;
        this.lists = lists;
        this.maps = maps;
        this.good = good;
        this.user = user;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getSize() {
        return size;
    }

    public void setSize(String size) {
        this.size = size;
    }

    public Date getStart() {
        return start;
    }

    public void setStart(Date start) {
        this.start = start;
    }

    public List getLists() {
        return lists;
    }

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

    public Map getMaps() {
        return maps;
    }

    public void setMaps(Map maps) {
        this.maps = maps;
    }

    public Boolean getGood() {
        return good;
    }

    public void setGood(Boolean good) {
        this.good = good;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    @Override
    public String toString() {
        return "Car{" +
                "color='" + color + ''' +
                ", size='" + size + ''' +
                ", start=" + start +
                ", lists=" + lists +
                ", maps=" + maps +
                ", good=" + good +
                ", user=" + user +
                '}';
    }
}
 

在resources目录下创建application.yaml配置文件中编写;

car:
  color: 红色
  size: 1200
  start: 2021/10/26
  list:
    - baoma
    - dazhong
    - aodi
  map: {name: 小杰,age: 88}
  user:
    account: 小智
    password: 527527
  good: true

测试使用;

package com.xiaozhi;

import com.xiaozhi.pojo.Car;
import com.xiaozhi.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class StudySpringboot02ApplicationTests {
    //自动装配类
    @Autowired
    private Car car;
    
    @Test
    void contextLoads2() {
        System.out.println(car);
    }
}

方式3:使用之前的application.properties 文件进行配置

创建实体类

package com.xiaozhi.pojo;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;


//注入spring容器
@Component
//指定读取配置文件;
@PropertySource(value = "classpath:pet.properties")
public class Pet {
    @Value("${pet.name}")
    private String name;
    @Value("${pet.color}")
    private String color;
    @Value("${pet.age}")
    private int age;

    public String getName() {
        return name;
    }

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

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Pet{" +
                "name='" + name + ''' +
                ", color='" + color + ''' +
                ", age=" + age +
                '}';
    }
}

在resources目录下创建pet.properties配置文件

pet.name=小智
pet.color=白色
pet.age=22

测试使用

package com.xiaozhi;

import com.xiaozhi.pojo.Pet;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class StudySpringboot02ApplicationTests {
    //自动装配类;
    @Autowired
    private Pet pet;
    //测试;
    @Test
    void contextLoads() {
        System.out.println(pet);
    }
}

使用yaml配置文件时也可使用的表达式;

创建实体类

package com.xiaozhi.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


//注入到spring容器;
@Component
//匹配到yaml配置文件中的 peoples对象的设置值;
@ConfigurationProperties(prefix = "peoples")
public class People {
    private String name;
    private int age;
    private String address;
    private String info;

    //getter,setter方法;
    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + ''' +
                ", age=" + age +
                ", address='" + address + ''' +
                ", info='" + info + ''' +
                '}';
    }
}

在application.yaml中添加people对象的属性值

可直接配置${random.uuid}生成随机的uuid值;
可以使用${random.int}生成随机的int值;
在设置info值的时候;用了${peoples.address:默认地址}_可追加后续;
判断是否有设置address的值;若没有设置,就会默认使用冒号后的值

peoples:
  name: 阿猫${random.uuid}
  age: ${random.int}
  address: 写入的地址
  info: ${peoples.address:默认地址}_可追加后续

测试执行;

package com.xiaozhi;

import com.xiaozhi.pojo.People;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class StudySpringboot02ApplicationTests {

    //自动装配类;
    @Autowired
    private People people;
    //测试;
    @Test
    void testMethod(){
        System.out.println(people);
    }
}    

使用yaml配置文件时,可 支持松散绑定

先创建实体类;
这里的属性命名时使用了驼峰命名

package com.xiaozhi.pojo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


//注入到spring容器中;
@Component
//匹配application.yaml配置文件后 指定对象的值;
@ConfigurationProperties(prefix = "computer")
public class Computer {
    //在这里使用驼峰命名;
    private String indexName;
    private int maxAge;

    public String getIndexName() {
        return indexName;
    }

    public void setIndexName(String indexName) {
        this.indexName = indexName;
    }

    public int getMaxAge() {
        return maxAge;
    }

    public void setMaxAge(int maxAge) {
        this.maxAge = maxAge;
    }

    @Override
    public String toString() {
        return "Computer{" +
                "indexName='" + indexName + ''' +
                ", maxAge=" + maxAge +
                '}';
    }
}

在application.yaml下创建;
在配置文件中的属性赋值时,使用了-连接;没有和实体类的属性驼峰方式保持一致;
但是单词是相同的;若不相同就取不到值

computer:
  index-name: 联想
  max-age: 500

测试使用

package com.xiaozhi;
import com.xiaozhi.pojo.Computer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class StudySpringboot02ApplicationTests {

    //自动装配类;
    @Autowired
    private Computer computer;
    //测试;
    @Test
    void testMethod(){
        System.out.println(computer);
    }
}    

5.不同位置的配置文件读取优先级

先去新建一个springboot项目

(1)直接在项目目录下创建config文件夹;然后在config文件夹内创建application.yaml配置文件
配置端口为1111

server:
  port: 1111

(2)在项目目录下直接创建application.yaml配置文件
配置端口为2222

server:
  port: 2222

(3)在resources目录下创建config文件夹;然后在config下创建application.yaml
配置端口为3333

server:
  port: 3333

(4)在resources目录下直接创建application.yaml配置文件
配置端口号为4444

server:
  port: 4444

执行主程序SpringbootStudy03Application
这里执行了1111的端口;即读取了项目目录下创建config文件夹的配置文件application.yaml

删除掉项目目录下创建config文件夹的配置文件application.yaml
再次执行主程序;
这时应用的端口为2222;即读取了项目目录下直接创建的application.yaml配置文件

同样地,删除掉项目目录下直接创建的配置文件application.yaml
再次执行主程序;
此时显示应用的端口为3333;即读取了在resources目录下创建的config文件夹下的配置文件

删掉在resources目录下创建的config文件夹下的配置文件application
这时再去执行主程序;
此时显示的端口就是4444; 即读取了resources目录下直接创建的配置文件

那么,经过这几个测试,配置文件的读取优先级也是显而易见的;
优先级由高到低;
(1)在项目目录下创建的config文件夹下的配置文件;
(2)在项目下直接创建的配置文件;
(3)在项目的resources目录下创建的config文件夹下的配置文件;
(4)在项目的resources目录下直接创建的配置文件.


6.多环境下的配置文件切换

比如说,在一套开发项目中,有开发环境的配置文件和测试环境的配置文件,那么如何快速地切换两个文件呢

两种方式:

6.1 方式1:在properties文件下;使用spring.profiles.active切换

首先在resources目录下创建一个application.properties配置文件,作为默认的配置文件;

# 默认的配置文件,
server.port=2333

然后在resources目录下创建一个application-development.properties配置文件,模拟开发环境下的配置文件

# 模拟开发环境下的配置; 配置端口号
server.port=8888

然后在resources目录下创建一个application-test.properties配置文件;模拟测试环境下的配置文件;

# 模拟测试环境下的配置;配置端口号
server.port=9999

初次执行一下主程序;当然一定是执行默认配置文件application.properties下的端口配置

切换到开发环境下的配置文件;
在application.properties中编写配置;注意只用-后的部分即可

# 默认的配置文件,
server.port=2333
#切换到开发环境下的配置文件;
spring.profiles.active=development

执行主程序;这里有显示以应用到模拟开发环境的配置文件

切换到测试环境下的配置文件;在application.properties下配置即可

#切换到开发环境下的配置文件;
spring.profiles.active=test

执行主程序,已经切换到模拟的测试环境配置文件

6.2 方式2:在yml文件下使用spring: profiles: active :切换

这次用yaml风格的配置文件试试方式2.

删掉之前的几个配置文件
在resources目录下创建application.yml配置文件;
在一个yml文件下,可直接用- - - 分开不同的环境配置;
而不需要创建使用多个文件;

在一个文件内直接配置默认配置的端口为1111;
用---分隔,然后直接配置模拟的开发环境下的端口为2222,且使用spring: profiles:为这块配置命名;
用---分隔,然后配置模拟的测试环境下的端口为3333,且命名;

server:
  port: 1111
---
server:
  port: 2222
spring:
  profiles: development
---
server:
  port: 3333
spring:
  profiles: test

执行主程序;执行的是默认的配置端口为1111

切换到模拟开发环境下的配置

server:
  port: 1111
spring:
  profiles:
    active: development
---
server:
  port: 2222
spring:
  profiles: development
---
server:
  port: 3333
spring:
  profiles: test

执行主程序,已切换到模拟的开发环境配置

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号