SpringBoot入门开发

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的顶级项目之一( Spring | Home)。

1.2 SpringBoot优点

Create stand-alone Spring applications

  • 创建独立Spring应用

Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)

  • 内嵌web服务器

  • Provide opinionated 'starter' dependencies to simplify your build configuration

    • 自动starter依赖,简化构建配置

    • 起步依赖 ,起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),

      定义了对其他库的传递依赖 ,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是 将具备某种功能的坐标打包到一起,并提供一些默认的功能

  • Automatically configure Spring and 3rd party libraries whenever possible

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

  • Provide production-ready features such as metrics, health checks, and externalized configuration

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

  • Absolutely no code generation and no requirement for XML configuration

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

Spring Boot入门开发

2.1 环境要求

环境准备:

2.2 快速构建SpringBoot项目

创建一个新项目

选择spring initalizr , 可以看到默认就是去官网的快速构建工具那里实现

填写项目信息

选择初始化的组件(初学勾选 Web 即可)

修改pom文件springboot版本和java版本

等待项目构建成功

2.2.1 项目打jar包

2.2.2 banner修改
  1. 项目下的 resources 目录下新建一个banner.txt 即可。

  2. 图案可以到: Spring Boot banner在线生成工具,制作下载英文banner.txt,修改替换banner.txt文字实现自定义,个性化启动banner-bootschool.net 这个网站生成,然后拷贝到文件中即可!

  3. 设置图片作为banner

        spring.banner.image.location=logo.png

2.2.3 项目列表显示优化

Spring Boot 核心配置

3.1 Spring Boot配置文件分类

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

  • application.properties

    • 语法结构 :key=value

       server.port=8081
  • application.yml

    • 语法结构 :key:空格 value (冒号后面必须要有空格)

      server:
       port: 8081

SpringBoot提供了2种配置文件类型:properteis和yml/yaml 默认配置文件名称:application 在同一级目录入如果三类文件共存,优先级为:properties > yml > yaml

3.2 YAML概述

YAML全称是 YAML Ain't Markup Language 。YAML是一种直观的能够被电脑识别的的数据数据序列化 格式, 并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比 如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简 洁。 YAML文件的扩展名可以使用.yml或者.yaml。

properties:

server.port=8080
 server.address=127.0.0.1

xml:

<server> 
	<port>8080</port> 
	<address>127.0.0.1</address> 
</server> 

yml:

server: 
	port: 8080 
	address: 127.0.0.1

3.3 YAML基础语法

  1. 大小写敏感

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

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

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

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

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

YAML:数据格式

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

boolean: TRUE               #TRUE,true,True,FALSE,false,False均可
float: 3.14                 #6.8523015e+5 #支持科学计数法
int: 123                    #0b1010_0111_0100_1010_1110 #支持二进制、八进制、十六进制
string: HelloWorld          #字符串可以直接书写
  • 数组:一组按次序排列的值( List、set )
address:
	- beijing
	- shanghai
 # 行内写法
commpany: [阿里巴巴,华为,腾讯,字节跳动]
  • 对象、Map(键值对)
person:
        name: wangzhuo
        # 行内写法
        person: {name: wangzhuo}
        #对象数组格式一
        users:- name: Tom
        age: 4- name: Jerry
        age: 5
        #对象数组格式二
        users:
        name: Tom
        age: 4
        name: Jerry
        age: 5
        #对象数组缩略格式
        users2: [ { name:Tom,age:4 },{ name:Jerry,age:5 } ]

YAML:参数引用

    name: wangzhuo
    person:
    name: xuelaoshi
    pet: ${name}    
# 引用上边定义的name值
    name: xuls${random.uuid} # 配置文件占位符,随机uuid
    name: ${person.name}_真帅

YAML:小结 (1) 配置文件类型

  • properties:和以前一样 (设置文件的语言编码UTF-8)

  • yml/yaml:注意空格

(2) yaml:简洁,以数据为核心

  • 基本语法

    • 大小写敏感

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

    • 使用空格缩进表示层级关系,相同缩进表示同一级

  • 数据格式

    • 对象

    • 数组: 使用 " - "表示数组每个元素

    • 纯量

  • 参数引用

    • ${key}

    @Component //注册bean
    public class Dog {
        @Value("阿黄")
        private String name;
        @Value("18")
        private Integer age;
    }

加载指定的配置文件@PropertySource :加载指定的配置文件; 我们去在resources目录下新建一个dog.yml文件

name: 阿黄
age: 18 
@PropertySource(value = "classpath:dog.yml")
@Component //注册bean
public class Dog{
    @Value("${name}")
    private String name;
    @Value("${age}")
    private Integer age;
}

批量注入方式1

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

@Component //注册bean到容器中
public class Person {
    private String name;
    private integer age;
    private boolean marry;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
    //有参无参构造、get、set方法、toString()方法  
}

编写yaml文件内容

person1:
        name: wangls
        age: 18
        marry: true
        birth: 1990/10/19
        maps: {k1: v1,k2: v2}
        lists:
            - code
        	- bodybuilding
        	- music
        dog:
        	name: summer
        	age: 1

将数据注入到我们的类中

/*
 @ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
*/
@Component //注册bean
@ConfigurationProperties(prefix = "person1")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
} 

3.4 读取配置内容

yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值! 支持方式: 逐个注入:@Value 批量注入:1.@ConfigurationProperties 2.Environment类

逐个注入演示

如果编写完配置文件有红色提示,则可以添加坐标隐藏

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-configuration-processor</artifactId>
 <optional>true</optional>
 </dependency>

批量注入方式2

直接在测试类中装配开发模式类辅助获取key对应value数据

    @Autowired
    private Environment env;
    @Test
    public void test(){
        System.out.println(env.getProperty("person1.name"));
        System.out.println(env.getProperty("person1.age"));
        System.out.println(env.getProperty("person1.dog.name"));
        System.out.println(env.getProperty("person1.lists[0]"));
    }

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

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

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

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

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

结论:

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

3.5 JSR303数据校验

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

  1. POST 、PUT 请求,使用

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

JSR303校验注解的使用步骤

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

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

 2.在实体类需要校验的成员字段(Field)上,添加校验注解。

@Component  //注册bean到容器中
//@ConfigurationProperties(prefix = "dog")
//@Validated
public class Dog {
    @NotNull(message = "狗名不能为空")
    private String name;
    @NotNull(message = "狗命不能为空")
    @Max(value = 15,message = "狗命拿来")
    private Integer age;
    @Min(value = -1,message = "狗还是个细胞")
    private Integer length;
    @Email(message = "邮箱必须合法")
    private String email;
}

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

    @RequestMapping("/validationDemo")
    public String validationDemo(@Valid Dog dog, 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 "数据合法";
        }
    }

 JSR303校验注解的分类

值校验:

// 被注解的元素必须为null
@Null(message = "必须为null") 
  
// 被注解的元素必须不为null
@NotNull(message = "必须不为null") 
  
// 校验注解的元素值不为空(不为null、去除首位空格后长度为0),类型为String
 @NotBlank(message = "必须不为空") 
// 校验注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0),类型为CharSequence、
Collection、Map、Array
 @NotEmpty(message = "必须不为null且不为空") 
// 被注解的元素必须为true,并且类型为boolean
 @AssertTrue(message = "必须为true") 
// 被注解的元素必须为false,并且类型为boolean
 @AssertFalse(message = "必须为false")

 长度校验:

// 被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map
 @Size(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
 // 校验注解的元素值长度在min和max区间内 ,并且类型为String
 @Length(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")

 格式校验:

// 校验注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal。
@Digits(integer=3,fraction = 2,message = "整数位上限为3位,小数位上限为2位")
 // 被注解的元素必须符合指定的正则表达式,并且类型为String
 @Pattern(regexp = "\\d{11}",message = "必须为数字,并且长度为11")
 // 校验注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String
 @Email(message = "必须是邮箱")

Controller统一异常处理

@ControllerAdvice:统一为Controller进行"增强"

@ExceptionHandler : 异常处理

import org.springframework.validation.BindException;
        import org.springframework.web.bind.annotation.*;
@ControllerAdvice
public class BindExceptionUtilAdvice {
    // 验证参数未使用@RequestBody注解
    @ExceptionHandler(BindException.class)
    @ResponseBody//选择添加
    public String handlerBindException(BindException ex, HttpServletRequest
            request){
        return "全局异常处理器成功"; // 跳转至统一提示错误信息的视图
    }
}

3.6 多环境切换profile

我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。 其中数据库地址、服务 器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。 profile功能就是来进行动态配置切换的;

命名语法:

例如:application-环境简称.properties/yml application-dev.properties/yml 开发环境 application-test.properties/yml 测试环境 application-pro.properties/yml 生产环境

1) profile配置方式

多profile文件方式

2) profile激活方式

配置文件 :

spring:
     profiles:
         active:  环境简称

  虚拟机参数 :在VM options 指定:-Dspring.profiles.active=dev ​ 命令行参数:java –jar xxx.jar --spring.profiles.active=dev

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值