SpringBoot(一)

news2024/12/25 13:54:00

1.Spring Boot概要

1.1 SpringBoot介绍

        随着动态语言的流行(Ruby、Scala、Node.js), Java的开发显得格外的笨重;繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术整合难度大。

        在上述环境下,Spring Boot由此诞生,它的设计是为了使您能够尽可能快地启动和运行。它使用 “习惯 优于配置” (项目中存在大量的配置,而 Spring Boot 内置一个习惯性的配置,让你无须手动进行配 置)的理念让你的项目快速运行起来。使用 Spring Boot 很容易创建一个独立运行(运行jar,内嵌 Servlet 容器)、准生产强力的基于 Spring 框架的项目,使用 Spring Boot你可以不用或者只需要很少 的 Spring 配置。提供了 J2EE 开发的一站式解决方案。 2014 年 4 月,Spring Boot 1.0.0 发布。Spring的顶级项目之一(https://spring.io)。

1.2 SpringBoot优点

①创建独立Spring应用

②内嵌web服务器

③自动starter依赖,简化构建配置;起步依赖 ,起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM), 定义了对其他库的传递依赖 ,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是 将具备某种功能的坐标打包到一起,并提供一些默认的功能

④自动配置Spring以及第三方功能

⑤提供生产级别的监控、健康检查及外部化配置

⑥无代码生成、无需编写XML

        SpringBoot是整合Spring技术栈的一站式框架,SpringBoot是简化Spring技术栈的快速开发脚手架,Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式

1.3 SpringBoot缺点

①人称版本帝,迭代快,需要时刻关注变化

②封装太深,内部原理复杂,不容易精通

2.Spring Boot 核心配置

2.1 环境要求

java version "1.8.0_181"

Maven-3.6.1

SpringBoot 2.x 最新版

2.2 Spring Boot配置文件分类

        SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置

⚪application.properties语法结构:

                                                key=value

⚪application.yml语法结构:

                                                key: 空格 value(冒号后面必须要有空格)

⚪SpringBoot提供了2种配置文件类型:properteis和yml/yaml

⚪默认配置文件名称:application

⚪在同一级目录入如果三类文件共存,优先级为:properties > yml > yaml

2.3 YML基础语法

YML语法规定

1. 大小写敏感

2. 数据值前边必须有空格,作为分隔符

3. 严格使用缩进表示层级关系

4. 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混 乱)。

5. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

6. "#"表示注释,从这个字符一直到行尾,都会被解析器忽略。

YML的数据格式

字面量:普通的值 [ 数字,布尔值,字符串 ]

数组:一组按次序排列的值( List、set )

对象、Map(键值对)

YAML:参数引用

2.4 读取配置内容

        yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值.支持单个注入和批量注入。

批量注入:1.@ConfigurationProperties

                  2.Environment类

逐个注入

语法

逐个注入:@Value

实例
//写法1:直接传值,不使用yml配置文件
@Component
public class Dog {
    @Value("大黄")
    private String dname;
    @Value("8")
    private  int dage;

@Override
    public String toString() {
        return "Dog{" +
                "dname='" + dname + '\'' +
                ", dage=" + dage +
                '}';
    }

    public Dog() {
    }

    public Dog(String dname, int dage) {
        this.dname = dname;
        this.dage = dage;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public int getDage() {
        return dage;
    }

    public void setDage(int dage) {
        this.dage = dage;
    }
}

 运行结果:Dog{dname='大黄', dage=8}

//写法2:通过yml配置文件传值
@Component
public class Dog {
    @Value("${dname}")
    private String name;
    @Value("${dage}")
    private Integer age;
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

 //yml配置文件

dname: 团团
dage: 10

运行结果:Dog{name='团团', age=10}

批量注入

//编写一个复杂一点的实体类:Person 类

//使用:@ConfigurationProperties(prefix = "persons")注解,prefix为我们要加载的yml文件中的配置内容

@Component
@ConfigurationProperties(prefix = "persons")
public class Person {
    private String name;
    private String email;
    private int age;
    private Date birthday;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;

//getter setter 构造方法 toString方法。。。
}

//yml文件

persons:
  last-name: 王
  name: 王老师
  email: 12345678@qq.com
  age: 50
  marry: true
  birth: 1990/10/19
  maps: {k1: v1,k2: v2}
  lists:
    - code
    - bodybuilding
    - music
  dog:
    name: summer
    age: 1

//测试类

@SpringBootTest
class SpringbootInit01ApplicationTests {
    @Autowired
    Person person;

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

}

对比

        @Value这个使用起来并不友好!我们需要为每个属性单独注解赋值,比较麻烦;我们来看个功能对比 图

1、@ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加

2、松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的, - 后面跟 着的字母默认是大写的。这就是松散绑定。可以测试一下

3、JSR303数据校验 , 这个就是我们可以在字段是增加一层过滤器验证 , 可以保证数据的合法

4、复杂类型封装,yml中可以封装对象 , 使用value就不支持

结论:

配置yml和配置properties都可以获取到值 , 强烈推荐 yml;

如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!

JSR303数据校验

        对于 web 服务来说,为防止非法参数对业务造成影响,在 Controller 层一定要做参数校验的!大部分 情况下,请求参数分为如下两种形式:

1. POST 、 PUT 请求,使用 requestBody 传递参数; 2. GET 请求,使用 requestParam/PathVariable 传递参数。

什么是 JSR303 标准?

        JSR的全称是Java Specification Requests(Java 规范提案),是指向JCP ( Java Community Process )提出新增一个标准化技术规范的正式请求。 Java API 规范( JSR303 )定义了         Bean 校验的标准 validation-api ,但没有提供实现。 hibernate validation 是对这个规范的实现,并增加了校验注解如 @Email 、 @Length 等。 Spring Validation 是对 hibernate validation 的二次封装,用于支持 spring mvc 参数自动校验。接下 来,我们以 spring-boot 项目为例,介绍 Spring Validation 的使用

JSR303校验注解的使用步骤

1.添加依赖,导入spring-boot-starter-validation启动器

<!--jsr303数据验证-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.在实体类需要校验的成员字段(Field)上,添加校验注解。并在Controller控制器的校验参数前,使用@Valid注解开启校验

@Component //注册bean到容器中
@ConfigurationProperties(prefix = "persons")
@Validated
public class Person {
    private String lastName;
    @Email(message = "邮箱格式不正确")
    private String email;
    @NotNull(message = "用户名称不能为空")
    private String name;
    @NotNull(message = "用户年龄不能为空")
    @Max(value = 150,message = "给年轻人留点机会吧")
    private int age;
    private boolean marry;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

3.在Controller控制器的校验参数前,使用@Valid注解开启校验,使用BindingResult 绑定校验结果

验证方式一: 

在yml文件中的数据必须符合刚刚我们定义的要求,如果不符合则报错,例如下面我们使用错误的邮箱格式:

结果:

验证方式二:

输入错误的邮箱格式(http://localhost:8081/demo01/dosave?lastName=王&email=123456&name=王老师&age=34&marry=true)

@Controller
public class UserController {
    //用户发送请求:
    //http://localhost:8081/demo01/dosave?lastName=王&email=123456@qq.com&name=王老师        
                                                         &age=34&marry=true
    //springMVC框架通过方法的参数进行请求中数据的获取,命名一直类型合法就可以接受到请求中的数据
    @RequestMapping(path = "/dosave")
    @ResponseBody
    public String dosave(@Valid Person person, BindingResult result){
        //得到所有错误信息计数
        int errorCount = result.getErrorCount();
        //错误数大于0
        if (errorCount>0){
            //得到所有错误
            List<FieldError> fieldErrors = result.getFieldErrors();
            //迭代错误
            for (FieldError fieldError:fieldErrors) {
                //错误信息
                System.out.println( "属性:{},"+fieldError.getField()+"传来的值是:{}"+fieldError.getRejectedValue()+",出错的提示消息:{}"+fieldError.getDefaultMessage());
            }
            return "数据不合法";
        }else{
            return "数据合法";
        }
    }

         但是当有多个类需要绑定校验结果时就要写多个BindingResult ,会导致数据冗余,所以我们可以使用全局异常处理器:

@ControllerAdvice //全局异常处理器
public class UserController {
    //BindException:异常类型
    @ExceptionHandler(BindException.class)
    @ResponseBody
    public String show(BindException e){
        return "数据不合法(全局异常处理器)";
    }
    @RequestMapping(path = "/dosave")
    @ResponseBody
    public String dosave(@Valid Person person){
        System.out.println(person);
        return "数据合法";
    }

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2051199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

每天五分钟计算机视觉:搭建人脸识别的Siamese深度神经网络模型

本文重点 前面的一篇文章中介绍了关于一次学习的问题,解决一次学习问题的关键在于学习到一个函数d,这个d可以计算出两张图片中的人脸是不是同一个人。那么我们需要搭建什么样的神经网络才可以让模型学习出这样的函数d呢?本文我们介绍一下Siamese神经网络结构,它可以帮助我…

快速上手体验MyPerf4J监控springboot应用(docker版快速开始-本地版)

使用MyPerf4J监控springboot应用 快速启动influxdb时序数据库日志收集器telegrafgrafana可视化界面安装最终效果 项目地址 项目简介: 一个针对高并发、低延迟应用设计的高性能 Java 性能监控和统计工具。 价值 快速定位性能瓶颈快速定位故障原因 快速启动 监控本地应用 idea配…

BeagleBone Black 上手

芯片特性 板级功能 资源内存 SDRAM 512MB DDR3L 800MHZ A single 256Mb x16 DDR3L 4Gb (512MB) memory device is used. The memory used is one of two devices: MT41K256M16HA-125 from Micron D2516EC4BXGGB from Kingston It will operate at a clock frequency of 400M…

DDD领域驱动设计的原理与实践

目录 什么是DDD领域驱动设计&#xff1f; 定义与概念&#xff1a; 核心思想&#xff1a; 核心概念&#xff1a; 核心原则&#xff1a; 优势与应用&#xff1a; 与微服务架构和传统三层架构的关系&#xff1a; 理解领域模型 举例 统一语言&#xff08;Ubiquitous Langu…

【C++11】入门基础

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目录…

基于Kotlin Multiplatform实现静态文件服务器(三)

Expect 和 Actual expect 关键字用于定义一个多平台通用的声明&#xff0c;即该声明在所有平台上都可用&#xff0c;并且需要在特定平台上实现。actual 关键字通常与 expect 关键字配合使用&#xff0c;用于定义多平台通用的接口和函数&#xff0c;从而允许在不同的平台上使用…

PyTorch--深度学习

onux部署功能 cpu运行时间 3. 自动求导 求导结果为&#xff1a;2 1 1

在java中前后端进行交互使用的内容

前言 本文将讲解在java前后端进行交互时会使用的内容, 过滤器 , 前后端交互时: 同步请求(了解)与异步请求, 后端响应json格式数据, 后端标准响应数据格式 过滤器 首先需要了解什么是过滤器: 过滤器是javaEE中在前向后端发送请求时进行拦截的技术,作用…

Linux系统编程(10)线程资源回收和互斥锁

一、pthread_cancel函数 pthread_cancel 函数用于请求取消一个线程。当调用 pthread_cancel 时&#xff0c;它会向指定的线程发送一个取消请求。 #include <pthread.h>int pthread_cancel(pthread_t thread);thread&#xff1a;要发送取消请求的线程标识符。 成功时&a…

函数递归,匿名、内置行数,模块和包,开发规范

一、递归与二分法 一&#xff09;递归 1、递归调用的定义 递归调用&#xff1a;在调用一个函数的过程中&#xff0c;直接或间接地调用了函数本身 2、递归分为两类&#xff1a;直接与间接 #直接 def func():print(from func)func()func() # 间接 def foo():print(from foo)bar…

mac安装ipd包【金铲铲为例】

mac安装ipd包 安装PlayCover 链接&#xff1a;https://github.com/PlayCover/PlayCover 1、点最新Releases 2、cmd ↓&#xff0c;拉到最下面下载dmg 3、安装 图标拖拽到Applications里 IPA下载 以金铲铲为例&#xff0c;良心砸壳包站点&#xff0c;有能力可以支持一下…

系列:水果甜度个人手持设备检测-行业法律法规

系列:水果甜度个人手持设备检测 --行业法律法规 背景 由于我们目标是制作针对水果的便携或手持式检测仪器&#xff0c;既然是民用产品&#xff0c;必然受一系列法律法规的约束&#xff0c;产品在上市之前将会受各种国家标准和地方标准的检验。本篇章中我们采用启发性搜索的方…

Python自动化:解锁高效工作与生产力的密钥

在当今快节奏的数字时代&#xff0c;自动化已成为提升工作效率、优化流程、减少人为错误的不可或缺的工具。Python&#xff0c;作为一种功能强大、易于学习且应用广泛的编程语言&#xff0c;在自动化领域扮演着举足轻重的角色。无论是数据处理、Web自动化、软件测试&#xff0c…

ETL数据集成丨将SQL Server数据同步至Oracle的具体实现

一、背景 在构建企业级数据架构时&#xff0c;将SQL Server数据库的数据同步至数仓数据库&#xff08;如Oracle&#xff09;是一项至关重要的任务。这一过程不仅促进了跨系统数据的一致性与可用性&#xff0c;还为数据分析、商业智能以及决策支持系统提供了坚实的数据基础。 …

黑神话悟空什么配置可以玩?什么样的游戏本配置可以畅玩《黑神话:悟空》?黑神话悟空电脑配置推荐

相信不少游戏爱好者&#xff0c;近期被《黑神话&#xff1a;悟空》这款游戏刷屏了&#xff0c;预售开启不到5分钟&#xff0c;所有的产品即宣告售罄&#xff0c;预购3天销售额就破亿&#xff0c;并迅速登顶Steam全球榜。作为一款备受期待的国产3A游戏&#xff0c;以其精美的画面…

IOS 10 统一颜色管理和适配深色模式

实现分析 像系统那样&#xff0c;给项目中常用的颜色取名字&#xff0c;这里使用扩展语法实现&#xff0c;好处是可以像访问系统颜色那样访问自定义的颜色。 添加依赖 为了能使用16进制的颜色值&#xff0c;这里通过依赖DynamicColor框架来实现 #颜色工具类 #https://githu…

美国洛杉矶大带宽服务器安全与权限

美国洛杉矶的大带宽服务器因其优越的地理位置、高速稳定的网络连接、丰富的资源以及强大的计算能力而受到众多企业和个人用户的青睐。尤其是在网络安全和权限管理方面&#xff0c;洛杉矶的大带宽服务器更是表现突出。下面我们就来详细了解一下这些服务器在安全与权限方面的特点…

Linux配置Maven环境

目录 一、Linux配置Maven环境1.1 挑选Maven版本1.2 下载到linux服务器1.3 解压1.4 配置环境变量1.5 测试 一、Linux配置Maven环境 1.1 挑选Maven版本 官网地址&#xff1a;https://maven.apache.org/download.cgi 这里以当前最新版本3.9.8为例 获取其对应的下载链接&#xf…

人工智能的新兴能力:我们是在追逐神话吗

图片由作者使用 DALL-E 拍摄 模型的涌现属性 突现属性不仅是人工智能的一个概念&#xff0c;也是所有学科&#xff08;从物理学到生物学&#xff09;的一个概念。这一概念一直让科学家着迷&#xff0c;他们既在描述这一概念&#xff0c;也在试图理解其起源。诺贝尔物理学奖得…

bootchart抓Android系统启动各阶段性能数据

最近在做Android系统启动优化&#xff0c;首要任务是找到启动过程中各阶段耗时点&#xff0c;进而有针对性地进行优化。主要用bootchart抓开机数据&#xff0c;本文主要记录下工具的使用方法。 1.抓开机数据 adb root adb shell ‘touch /data/bootchart/enabled’ adb rebo…