SpringBoot的搭建和使用

1、SpringBoot概要
(1)什么是SpringBoot?

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

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

(2)SpringBoot的优点
  • 创建独立Spring应用。
  • 内嵌web服务器。
  • 自动starter依赖,简化构建配置。
  • 起步依赖 ,起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖 ,这些东西加在一起即支持某项功能。 简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
  • 自动配置Spring以及第三方功能。
  • 提供生产级别的监控、健康检查及外部化配置。
(3)SpringBoot的缺点
  • 人称版本帝,迭代快,需要时刻关注变化。
  • 封装太深,内部原理复杂,不容易精通。
   (4)什么是微服务?
  • 微服务是一种架构风格
  • 一个应用拆分为一组小型服务
  • 每个服务运行在自己的进程内,也就是可独立部署和升级
  • 服务之间使用轻量级HTTP交互
  • 服务围绕业务功能拆分
  • 可以由全自动部署机制独立部署
  • 去中心化,服务自治。服务可以使用不同的语言、不同的存储技术
 2、SpringBoot入门开发
(1)Spring的基本框架

        spring架构大概就如上图所示,controller为控制层,pojo为bean实体类层,util为工具层,SpringbootInit01Application为为应用程序类,是springboot程序的入口点

在resource里面:

 static是静态资源目录,用于存放网页的静态文件,如 HTML、CSS、JavaScript、图片等。

 templates是模板文件目录,用于存放 Thymeleaf、Freemarker 等模板引擎使用的模板文件。

application.properties是Spring Boot的配置文件之一,使用 .properties 格式。可以在这里配置 Spring Boot 应用的各类参数,如数据库连接信息、服务器端口、日志级别等。

 application.yml是Spring Boot 的配置文件之一,使用 .yml (YAML) 格式。与 application.properties 功能相同,但 YAML 格式更加简洁和结构化,适合表示层次化的数据。

 application-dev.ymlapplication-test.yml是用于切换当前端口。

banner.txt是自定义启动横幅文件。

(2)运行原理初步探究

 spring-boot-starter-parent:

  • springBoot项目都要继承spring-boot-starter-parent
  • spring-boot-starter-parent中定义了若干个依赖管理
  • 继承parent模块可以避免多个依赖使用相同技术时出现依赖冲突
  • 继承parent的形式也可以采用引入依赖的形式实现效果例如alibaba

 start:导入套餐形式的坐标从而简化配置,坐标实现依赖传递。

引导类:

  • 程序主入口,初始化spring容器,扫描所有类
  • 可以通过run方法返回值获取bean检验

 内嵌tomcat

3、Spring Boot核心配置
(1)springboot基本配置概要

        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
 (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)YAML基础语法

        注意事项:

  • 大小写敏感
  • 数据值前边必须有空格,作为分隔符
  • 使用缩进表示层级关系
  • 缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数目可能不同,导致层次混 乱)。
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可。
  • "#"表示注释,从这个字符一直到行尾,都会被解析器忽略。

 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}_真帅

  这里主要是可以进行参数注入。

语法注意:

        配置文件类型:

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

        yml/yaml:注意空格

        yaml:简洁,以数据为核心

 yaml语法:

        基本语法:

  • 大小写敏感
  • 数据值前边必须有空格,作为分隔符
  • 使用空格缩进表示层级关系,相同缩进表示同一级

         数据格式:

  • 对象
  • 数组: 使用 " - "表示数组每个元素
  • 纯量

 参数引用:${key}

(4)读取配置内容

        yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值

         支持方式:

                逐个注入:@Value

                批量注入:@ConfigurationProperties / Environment类

逐个注入演示:

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

        加载指定的配置文件@PropertySource:加载指定的配置文件;

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

         我们去在resources目录下新建一个dog.yml文件:

name: 阿黄
age: 18 

批量注入方式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文件内容:

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

将数据注入到我们的类中:

@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;
} 

       @ConfigurationProperties作用:将配置文件中配置的每一个属性的值,映射到这个组件中; 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应。

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

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

        测试类中测试:

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    Person person; //将person自动注入进来
    @Test
    public void contextLoads() {
        System.out.println(person); //打印person信息
   }
}

@SpringBootTest 会启动一个完整的 Spring 应用上下文。

批量注入方式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]"));    
}

        Environment 是 Spring 中用来访问应用程序环境的接口,它可以用来获取属性文件中的属性值,比如 application.properties 或 application.yml 中的配置项。

        Environment 的 getProperty 方法来读取配置文件中的属性。

 @ConfigurationProperties和@Value的对比:

  • @ConfigurationProperties只需要写一次即可 , @Value则需要每个字段都添加
  • 松散绑定:这个什么意思呢? 比如我的yml中写的last-name,这个和lastName是一样的,- 后面跟着的字母默认是大写的。这就是松散绑定。
  • JSR303数据校验,这个就是我们可以在字段是增加一层过滤器验证,可以保证数据的合法性。
  • 复杂类型封装,yml中可以封装对象,使用value就不支持。

各种注入的总结:

  • 配置yml和配置properties都可以获取到值,强烈推荐 yml;
  • 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value;
  • 如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接 @configurationProperties;
(5) 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校验注解的使用步骤:

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

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

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

@Component //注册bean到容器中
// 配置文件中以persons为前缀的属性将会被映射到该Java类的对应字段上
//@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;
    
    // get/set方法
    // toString方法
}

        其中@Validated通常用于类级别或方法级别,与 @Valid 不同的是,它支持分组校验(validation groups),因此在需要不同校验组的情况下,@Validated 更为适用。也就是说一整个类都可以被校验。

        其中@Valid 通常用于方法参数、方法返回值、以及嵌套对象的校验。在控制器方法中,用于验证请求中的单个参数或对象,用于验证嵌套的对象

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

//新增
    //用户发送请求:http://localhsot:8080/dosave?lastName=王&email=123456@qq.com&name=王老师&age=34&marry=true
    //springMVC框架通过方法的参数进行请求中数据的获取,命名一直类型合法就可以接受到请求中的数据
    // 当客户端发送到 /dosave 路径的HTTP请求时,Spring会调用这个 dosave 方法。
    @RequestMapping(path = "/dosave")
    // 表示该方法的返回值应该直接作为HTTP响应的正文(Response Body)返回给客户端
    @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 "数据合法";
        }
    }

        Controller控制器的用法就是用于处理 HTTP 请求中的数据,并进行数据校验。代码的功能是接收客户端通过 HTTP 请求发送的数据,验证这些数据是否合法,并返回相应的结果给客户端。

        其中@RequestMapping(path = "/dosave"):这个注解用于映射 HTTP 请求到特定的处理方法。在这个例子中,当客户端发送一个路径为 /dosave 的请求时,Spring 会调用 dosave 方法来处理这个请求。换句话说,当用户在浏览器中访问http://yourdomain.com/dosave时,这个方法将会被调用。

       @ResponseBody:这个注解表示方法的返回值应该直接作为 HTTP 响应的正文(Response Body)返回给客户端,而不是作为视图名来处理。也就是说,dosave 方法的返回值(字符串)将直接发送给客户端。

示例代码:

    // 将会处理来自路径/doinit的HTTP请求。换句话说,当用户在浏览器中访问http://yourdomain.com/doinit时,这个方法将会被调用。
    @RequestMapping(path = "/doinit") // 处理用户请求
    @ResponseBody // 将方法返回值转换为json并响应给方法的请求者
    public String doinitMethod(){
        System.out.println("控制器成功处理用户请求!");
        return "今天周五,下午轰趴";
    }

         相当于在访问 http://yourdomain.com/doinit 时,会将当前方法中的返回参数返回给客户端。

        言归正传,这里大概的工作流程就是:result.getErrorCount():获取校验错误的数量,如果有错误则大于0进入循环打印出错误并返回数据不合法,如果没错误则返回数据合法。

(6)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")

        范围校验:

// 被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double
@Min(value = 18, message = "必须大于等于18")
 
// 被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double
@Max(value = 18, message = "必须小于等于18") 
 
// 校验注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal
@DecimalMin(value = "150", message = "必须大于等于150") 
 
// 校验注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal
@DecimalMax(value = "300", message = "必须大于等于300")
 
// 校验注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,
byte,short,int,long。
@Range(max = 80, min = 18, message = "必须大于等于18或小于等于80") 
 
// 被注解的元素必须为过去的一个时间,并且类型为java.util.Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Past(message = "必须为过去的时
间")
 
// 被注解的元素必须为未来的一个时间,并且类型为java.util.Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Future(message = "必须为未来的时
间")

          长度校验:

// 被注解的元素的长度必须在指定范围内,并且类型为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 = "必须是邮箱")
(7)Controller统一异常处理

        @ControllerAdvice:统一为Controller进行"增强",这个注解用于定义全局的异常处理器。它会作用于所有标注了 @Controller 或 @RestController 的控制器,允许你在一个地方处理应用程序中所有控制器的异常。不加的话就只会处理当前控制器类的异常。

        @ExceptionHandler : 这个方法用于处理控制器类中发生的 BindException 异常,只在当前控制器类中处理指定的异常,不具有全局性。

public class BindExceptionHander {
 
    // 全局异常处理
    @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 "数据合法";
    }
(8)多环境切换profile

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

 命名语法为:

  • application-dev.properties/yml 开发环境
  • application-test.properties/yml 测试环境
  • application-pro.properties/yml 生产环境

 比如现在我的文件是如下所示:

 我的application.yml配置文件为:

spring:
  profiles:
    active: test

我的测试环境配置文件为:

server:
  port: 8090

那么就会我们现在执行的端口号就从默认的8080换成了8090:

        虚拟机参数 :在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、付费专栏及课程。

余额充值