springboot学习

Posted 轻舟一曲

tags:

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

开篇

SpringBoot官方doc:

https://docs.spring.io/spring-boot/docs/
<html lang="en" xmlns:th="http://www.thymeleaf.org">

前情回顾

  • JavaSe:OOP
  • mysql:持久化
  • Html5+CSS3+javascript+jQuey+框架:视图层
  • JavaWeb:原始独立开发MVC三层架构网站
  • SSM框架:简化开发流程,但是配置也开始较为复杂
    • 项目打war包:Tomcat中运行
  • Spring在简化:SpringBoot—>进入微服务架构时代!
    • 项目打jar包,内嵌Tomcat
  • 服务越来越多:SpringCloud

微服务阶段:SpringBoot


学习路线

SpringBoot介绍

Spring是一个开源框架,或者通俗的讲就是一个容器

Spring是如何简化Java开发的

Spring采用4中关键策略:

  1. 基于POJO的轻量级和最小侵入性编程;
  2. 通过IOC,依赖注入DI和面向接口实现松耦合;
  3. 基于切面AOP和惯例进行声明式编程;
  4. 通过切面和模板减少代码样式。

什么是SpringBoot?

SpringBoot基于Spring4.0设计,Spring应用的整个搭建和开发过程。另外SpringBoot通过集成大量的框架使得依赖包的版本冲突,以及引用的不稳定性等问题得到了很好的解决。

SpringBoot所具备的特征有:

  1. 可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;
  2. 内嵌Tomcat或Jetty等Servlet容器;
  3. 提供自动配置的“starter”项目对象模型(POMS)以简化maven置;
  4. 绝对没有代码生成,不需要XML配置。

SpringBoot框架中还有两个非常重要的策略:开箱即用和约定优于配置

什么是开箱即用?

是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。

什么是约定大于配置?

是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。

前端常使用模板引擎

主要有FreeMarker和Thymeleaf

程序=数据结构+算法—程序员

???

程序=面向对象+框架—码农

微服务介绍

MVC三层架构 MVVM前端架构 微服务架构;

业务:service:UserService:===>模块;

Springmvc,controller===>提供接口;

微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用2必须构建成一系列小服务的组合;通过http,rpc的方式互通。

单体应用架构

应用中的所有应用服务都封装在一个应用中。无论是ERP,CRM或是其他系统,都把数据库访问和web访问等等功能放到一个war内。

优点:

  • 易于开发和调试,方便部署;
  • 需要拓展时只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了。

缺点:

  • 哪怕修改一个很小的地方,都需要停掉整个微服务,重新打包,重新部署这个war包;
  • 特别是对于大型应用,我们不可能将所有内人放在一个应用里,所以如何维护和分工;

微服务架构

所谓微服务架构,就是把每个功能独立出来,把独立出来的功能元素动态组合,需要的功能才拿去组合,需要多一些时可以整合多个功能元素。所以微服务架构是对功能元素的复制,而没有对整个应用进行复制。

优点:

  • 节省调用资源
  • 每个功能元素的服务都是一个可替换额,可独立升级的软件代码;

自由组装。

微服务架构(Microservices) | 黯羽轻扬 (ayqy.net)

第一个SpringBoot

  • jdk1.8
  • maven3.6
  • springboot
  • idea

创建:

  • 官方提供了快速生成的网站

  • idea继承了了这个网站

项目结构:

需要在HellowordApplication同级目录下建包

测试:@RestController<=>@RequestMapping+@RequestBody;

接口自动装配了,写了就能直接运行。

springboot所有依赖都是使用Spring-boot开头:

这里的web依赖用于实现http接口,依赖中包含了Springmvc,官网描述:

使用springmvc构建web包括restful的应用程序的入门者,使用Tomcat作为默认嵌入式容器。

packget打包成jar包,不依赖其他东西直接可执行:

使用idea创建第一个SpringBoot程序

删除多余文件:

导入web依赖:

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

spring-boot-starter默认就是一个启动器。

测试:

@Controller
@RequestMapping("/test01/")
public class hello 
    //返回字符串
    @RequestMapping("/hello")
    @ResponseBody
    public String test01()
        return "我的第一个SpringBoot程序";
    

可以直接在application.properties配置文件中修改端口号:

server.port=8081

创建自己的banner

banner.txt

          _____                    _____                    _____                    _____
         /\\    \\                  /\\    \\                  /\\    \\                  /\\    \\
        /::\\____\\                /::\\    \\                /::\\    \\                /::\\____\\
       /::::|   |               /::::\\    \\              /::::\\    \\              /:::/    /
      /:::::|   |              /::::::\\    \\            /::::::\\    \\            /:::/    /
     /::::::|   |             /:::/\\:::\\    \\          /:::/\\:::\\    \\          /:::/    /
    /:::/|::|   |            /:::/__\\:::\\    \\        /:::/__\\:::\\    \\        /:::/    /
   /:::/ |::|   |           /::::\\   \\:::\\    \\      /::::\\   \\:::\\    \\      /:::/    /
  /:::/  |::|___|______    /::::::\\   \\:::\\    \\    /::::::\\   \\:::\\    \\    /:::/    /      _____
 /:::/   |::::::::\\    \\  /:::/\\:::\\   \\:::\\    \\  /:::/\\:::\\   \\:::\\    \\  /:::/____/      /\\    \\
/:::/    |:::::::::\\____\\/:::/  \\:::\\   \\:::\\____\\/:::/  \\:::\\   \\:::\\____\\|:::|    /      /::\\____\\
\\::/    / ~~~~~/:::/    /\\::/    \\:::\\  /:::/    /\\::/    \\:::\\   \\::/    /|:::|____\\     /:::/    /
 \\/____/      /:::/    /  \\/____/ \\:::\\/:::/    /  \\/____/ \\:::\\   \\/____/  \\:::\\    \\   /:::/    /
             /:::/    /            \\::::::/    /            \\:::\\    \\       \\:::\\    \\ /:::/    /
            /:::/    /              \\::::/    /              \\:::\\____\\       \\:::\\    /:::/    /
           /:::/    /               /:::/    /                \\::/    /        \\:::\\__/:::/    /
          /:::/    /               /:::/    /                  \\/____/          \\::::::::/    /
         /:::/    /               /:::/    /                                     \\::::::/    /
        /:::/    /               /:::/    /                                       \\::::/    /
        \\::/    /                \\::/    /                                         \\::/____/
         \\/____/                  \\/____/                                           ~~

自动装配原理

pom.xml

核心依赖spring-boot-dependencies在父工程中:

在引入一些SpringBoot依赖的时候不需要指定版本就是因为有这个版本仓库。

启动器

就是Springboot的启动场景。

比如spring-boot-starter-web就会帮我们导入外部环境的所有依赖。

SpringBoot将所有的功能场景都变成了一个个启动器。

主程序

注解:

  • @SpringBootApplication

    • @SpringBootConfiguration

      SpringBoot的配置

​ @Configuration

  • @EnableAutoConfiguration

    • AutoConfigurationPackage

      自动导入配置,包注册

    • @AutoConfigurationImportSelector.class 自动导入选择

      获取所有文件的配置:

      获取候选的配置:

      自动配置的核心文件:

      springboot工厂的加载:

小结

SpringBoot中所有自动配置都是在启动的时候并加载:spring.factories包含所有的自动配置类,但是要导入对应的start启动器其对应的自动装配配置才能生效。

  1. SpringBoot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
  2. 将这些自动配置类导入容器,自动配置就会生效,帮我们自动配置;
  3. 以前我们需要自动配置的东西,现在SpringBoot帮我们做了;
  4. 整个JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.4.4.jar下;
  5. 它会将所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
  6. 容器中也会存在非常多的xxxAutoConfiguration(@Bean)的文件,就是这些类给容器中导入了这个场景的所有组件;并自动配置,@Configuration ,JavaConfig;
  7. 有了自动配置类,就免去了我们手动编写配置文件的工作。

主启动类运行

这个main方法其实是开启了一个服务。

分析该方法主要两部分,一部分是SpringApplication的实现,二是run方法的实现。

SpringApplication类

JavaConfig @Configuraion @Bean

主要做4件事:

  1. 推断应用的类型是普通的项目还是web项目;
  2. 查找并加载所有可用初始化器,设置到intializers属性中;
  3. 找出所有的应用程序监听器,设置到listens属性中;
  4. 推断并设置main方法的定义类,找到运行的主类。

构造器:

启动:

yaml

概述

(25条消息) Springboot-官方详细配置_叶巨岩的博客-CSDN博客

YAML是"YAML Ain’t a Markup Language"(YAML不是一种标记语言)的递归缩写。开发的这种语言时,YAML 的意思其实是:“Yet Another Markup Language”(仍是一种标记语言),但为了强调这种语言以数据做为中心,而不是以标记语言为重点,而用反向缩略语重命名。

properties只能保存键值对。

application.yaml:对空格的要求非常严格,层级关系

# 普通的k=name
name: 上官
# 对象
student:
  name: 婉儿
  age: 18

# 行内写法
student2: name:婉儿,age:18

# 数组
pets:
  - cat
  - dog
  - pig

pets2: [cat,dog,pig]

application.yaml强大之处在于可以注入到配置类和实体类当中。

属性赋值

yaml

Spring方式:@Value() @Autowired

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Dog 
    @Value("西西")
    private String name;
    @Value("9")
    private Integer age;

自动装配:

    @Autowired
    //有很多条狗时用@Qualifier()指定
    Dog dog;
    @Test
    void contextLoads() 
    

缺点:需要在源代码里配多个实体比较麻烦。

通过yaml实现 @ConfigurationProperties

Person:
  name: 上官$ramdon.int
  age: 18
  happy: true
  birth: 2021/5/27
  map: k1: v1,k2: v2
  list:
    - music
    - code
    - beauty
  dog:
    name: $person.name:helllo_花花
    age: 3
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

绑定:@ConfigurationProperties(prefix = “person”)

@Component
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "person")
public class Person 
    private String name;
    private Integer age;
    private boolean happy;
    private Date birth;
    private Map<String,Object> map;
    private List<Object> list;
    private Dog dog;

测试:

    @Autowired
    private Person person;
    @Test
    void contextLoads() 
        System.out.println(person);
    

properties

指定配置文件。

@PropertySource(value = "classpath:mf.properties")

还需要取,所以相对yaml不是很灵活。

@PropertySource(value = "classpath:mf.properties")//加载指定的配置文件
public class Person 
    //Spring的El表达式取出配置文件的值
    @Value("$name")
    private String name;

JavaConfig绑定配置文件的值可以采取以上两种方式。

对比

  • 松散绑定:比如yaml中写的last-name,这个和lastName是一样的。
  • JSR303数据校验:这个就是我们可以在字段增加一层过滤器验证,可以保证数据合法性。
  • 复杂类型封装:yaml中可以封装对象,使用@value就不行。

如果只是想获取其中的一个值可以使用@value,但是官方强烈推荐yaml.

JSR303

@Validated//开启数据校验

注解启动器:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
@Component //注册bean
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties(prefix = "person")
@Validated//数据校验
public class Person 
    @Email(message="必须为邮件格式")
    private String name;
    @Max(value = 20,message="有点老哦")
    private Integer age;
    @NotNull(message="happy不能为空")
    private boolean happy;
    private Date birth;
    private Map<String,Object> map;
    private List<Object> list;
    private Dog dog;

有个小问题就是:Boolean不能用@NotNull判断。。。

环境配置

概述

多环境配置以及配置文件位置。

四个有优先级:1>4>2>3 我们默认配置是3优先级最低的一个

多环境切换

真实开发:测试环境,生产环境。。。

profile是Spring对不同环境提供不同配置功能的支持,可以激活不同的环境版本,实现快速切换环境:

方式一:多配置文件

server:
  port: 8081
#springboot的多环境配置,选择激活那一套环境
spring:
  profiles:
    active: dev

以上写法是properties的,懒得改了;

现在介绍yaml的可以直接在一个yaml文件配置多套环境:

server:
  port: 8081
spring:
  profiles:
    active: dev
---
server:
  port: 8082
spring:
  profiles: dev
---
server:
  port: 8083
spring:
  profiles: test

自动配置再讲解

配置文件到底可以写什么。。。

与spring.factories具有非常强的联系。

举例:codec.CodecsAutoConfiguration

@Configuration(//表示是一个配置类
    proxyBeanMethods = false
)
@ConditionalOnClass(CodecConfigurer.class, WebClient.class)//spring底层注解,根据不同条件判断当前类是否生效
@AutoConfigureAfter(JacksonAutoConfiguration.class)
@EnableConfigurationProperties(CodecProperties.class)//自动配置的配置属性

在我们的配置文件中能配置的东西都存在一个固有的规律:

xxxAutoConfiguration—>xxxProperties—>配置文件绑定—》我们就可以使用自定义配置了。

自动装配原理精髓:

  1. SpringBoot启动加载大量的自动配置类;
  2. 我们看看需要的功能有没有在SpringBoot默认写好的自动配置类中;
  3. 然后再看这个自动配置类中到底配置了那些组件,只要我们要用的组件存在其中我们就不需要手动配了;
  4. 给容器中自动配置类添加组件时,会从properties类中获取某些属性,我们只需要在配置文件中指定这些属性的值就好。

xxxAutoConfiguration:自动配置类;给容器中添加组件;

xxxProperties:封装配置文件中相关属性。----》SpringBoot配置 yaml

查看哪些配置类生效:debug: true

Web开发

概述

jar:webapp!

自动装配,SpringBoot到底帮我们配置了什么东西?可以修改吗?可以扩展吗?

  • xxxAutoConfiguration:向容器中自动配置组件;
  • xxxProperties:自动配置类装配配置文件中自定义的内容。

web开发要解决的问题:

  • 导入静态资源。。。
  • 首页
  • jsp–》模板引擎Thymeleaf
  • 装配和拓展springmvc
  • 增删改查
  • 拦截器
  • 中英文切换

静态资源

方式一

webjars是什么?

所支持的目录

在/**下的东西都会在这四个静态资源的目录下找:

优先级:resource>static>public

一般:public放js,static放图片,resource放上传文件。

总结:

  1. 在SpringBoot,我们可以使用一下几种方式处理静态资源
    • webjars 映射localhost:808/webjars/
    • /**>resource>static(默认)>public直接映射localhost:808/

首页

//在template下的所有页面之只能通过controller来跳转
//需要模板引擎的支持
@Controller
public class Index 
    @RequestMapping("/index")
    public String index()
        return "index";
    


修改图片为ico:先另存为这串名字然后在删除;

直接另存为ico就行了。

thymeleaf

概述

找到依赖:高版本还不好找

https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/#using-boot-starter

导入依赖:

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

语法

导入约束

<html lang="en" xmlns:th="http://www.thymeleaf.org">
$... 变量表达式,Variable Expressions

@... 链接表达式,Link URL Expressions

#... 消息表达式,Message Expressions

~... 代码块表达式,Fragment Expressions

*... 选择变量表达式,Selection Variable Expressions

测试:

@Controller
public class Index 
    @RequestMapping("/test")
    public String test(Model model)
        model.addAttribute("msg","Thymeleaf by Model");
        return "test";
    

所有的html元素都可以被thymeleaf

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

SpringBoot-Mybatis_Plus学习记录之公共字段自动填充

SpringBoot学习-SpringBoot添加支持CORS跨域访问

第257天学习打卡(知识点回顾 springboot自动配置)

第272天学习打卡(知识点回顾springboot异常处理步骤流程)

springboot 开发中将 bean 放入容器 你知道的有几种方式?

Springboot第一章:JavaConfig注解