SpringBoot-1

概述

什么是Spring

Spring是一个开源框架,2003年兴起的一个轻量级的Java开发框架,作者:RodJohnson。
Spring是为下解决企业级应用开发的复杂性而创建的,简化开发。

Spring是如何简化Java开发的

为了降低Java开发的复杂性,Spring采用了以下4种关键策略:

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

什么是SpringBoot

一个javaweb的开发框架,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置,you can “just run”,能迅速的开发web应用,几行代码开发一个http接口

所有的技术框架的发展似乎都遵循了一条主线规律:从一个复杂应用场景衍生一种规范框架,人们只需要进行各种配置而不需要自己去实现它,这时候强大的配置功能成了优点;发展到一定程度之后,人们根据实际生产应用情况,选取其中实用功能和设计精华,重构出一些轻量级的框架;之后为了提高开发效率,嫌弃原先的各类配置过于麻烦,于是开始提倡“约定大于配置”,进而衍生出一些一站式的解决方案。

Spring Boot的主要优点

  • 为所有Spring开发者更快的入门
  • 开箱即用,提供各类迷人配置简化项目配置
  • 内嵌式容器简化web项目
  • 没有冗余代码生成和XML配置的要求

原理

开发任何一个Spring Boot项目,都会用到如下的启动类

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱,我们要从这两位开始就可以了。

自动装配原理分析

结论

springboot所有自动配置都是在启动的时候扫描并加载:springfactories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效然后就配置成功!

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

自动装配原理的精髓

  1. SpringBoot启动会加载大量的自动配置类
  2. 我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中
  3. 我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
  4. 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可
    **xxxxAutoConfigurartion:自动配置类;**给容器中添加组件
    xxxxProperties:封装配置文件中相关属性;

@Conditional

了解完自动装配的原理后,我们来关注一个细节问题,自动配置类必须在一定的条件下才能生效:
@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;

@ConditionalOnExpression 当表达式为true的时候,才会实例化一个Bean
@ConditionalOnBean 当容器中有指定Bean的条件下进行实例化
@ConditionalOnMissingBean 当容器里没有指定Bean的条件下进行实例化
@ConditionalOnClass 当classpath类路径下有指定类的条件下进行实例化
@ConditionalOnMissingClass 当类路径下没有指定类的条件下进行实例化
@ConditionalOnWebApplication 当项目是一个Web项目时进行实例化
@ConditionalOnNotWebApplication 当项目不是一个Web项目时进行实例化
@ConditionalOnProperty 当指定的属性有指定的值时进行实例化
@ConditionalOnExpression 基于SpEL表达式的条件判断
@ConditionalOnJava 当JVM版本为指定的版本范围时触发实例化
@ConditionalOnResource 当类路径下有指定的资源时触发实例化
@ConditionalOnJndi 在JNDI存在的条件下触发实例化
@ConditionalOnSingleCandidate 当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化

那么多的自动配置类,必须在一定的条件下才能生效:也就是说,我们加载了这么多的配置类,但不是所有的都生效了。

我们怎么知道哪些自动配置类生效;我们可以通过启用debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;

# 开启springboot的调试类,查看哪些自动配置类生效了,哪些没有生效
debug=true
  • Positive matches:(自动配置类启用的:正匹配)
  • Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
  • Unconditional classes:(没有条件的类)

输出的日志我们可以在这里看下:

SpringBoot配置

  • 新建一个spring项目

  • 安装插件后删掉多余的文档,重启项目

  • properties转yaml

YAML

概述

YAML是"YAML Ain’t a Markup Language"(YAML不是一种置标语言)的递归缩写。
在开发的这种语言时,YAML的意思其实是:“Yet Another Markup Language”(仍是一种置标语言)

YAML A Markup Language:是一个标记语言
YAML isnot Markup Language:不是一个标记语言

标记语言
以前的配置文件,大多数都是使用xml来配置;比如一个简单的端口配置,我们来对比下yaml和xml

yaml配置:

server:port: 8080

xml配置:

<server><port>8080</port>
</server>

YAML语法

基本语法:

k:(空格)v

以此来表示一对键值对(空格不能省略);以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级的。

注意:属性和值的大小写都是十分敏感的。

例子:

# 对空格的要求十分严格
# 注入到我们的配置类中!# 普通的key-value
name: zxl# 对象
student:name: zxlage: 22# 行内写法
student: {name: zxl,age: 22}# 数组
pets:- cat- dog- pigpets: [cat,dog,pig]

给属性赋值的几种方式

yaml赋值

实体类加@Component注册bean和@ConfigurationProperties(prefox = “在yml文件中的实体类名”)

  • 弹出配置提示,可配置可不配置,配置会出现提示,不配置会爆红但是不影响

  • 导入配置依赖,就不会爆红没交给springboot配置

  • <dependency><groudId>org.springframework.boot</groudId><artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>
    

使用properties和注解赋值

  • 自定义zxl.properties在resource目录下
  • 实体类使用注解**@PropertySource(value = “classpath:zxl.properties”)**,加载指定的配置文件
  • properties中用键值对的方式对实体类对应的属性进行赋值,例如:name=zxl
  • 然后对每一个属性使用注解**@value("${name}"),使用el表达式**取出配置文件中的值

yaml中的值也可以从properties中用el表达式获取

properties配置文件如果要使用中文,为了避免乱码需要到settings–>FileEncoding中配置UTF-8

两种方式的对比

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

结论

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

JSR303数据校验

springboot中可以使用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。这里写个注解让name只能支持Email格式

@Component//注册bean
@ConfigurationProperties(prefix = "person")
@Validated//数据校验
public class Person{//@Value("${person.name}")@Email(message="邮箱格式错误") private String name;@NotNull(message="名字不能为空") private String userName;@Max(value=120,message="年龄最大不能查过120") private int age;
}

空检查

@Null 验证对象是否为null
@NotNull 验证对象是否不为null,无法查检长度为0的字符串
@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
@NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查

@AssertTrue 验证Boolean对象是否为true
@AssertFalse 验证Boolean对象是否为false

长度检查

@size(min=,max=) 验证对象(Array,CollectionMap,string)长度是否在给定的范围之内
@Length(min=,max=) Validates that the annotated string is between min and max included.

日期检查

@Past 验证Date和Calendar对象是否在当前时间之前
@Future 验证Date和Calendar对象是否在当前时间之后
@Pattern 验证String对象是否符合正则表达式的规则

实际上全部都可以用正则表达式实现

多环境配置及文件位置

文件位置

  • springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

    优先级1:项目路径下的config文件夹配置文件

    优先级2:项目路径下配置文件
    优先级3:资源路径下的config文件夹配置文件

    优先级4:资源路径下配置文件

  • 优先级从高到弱

    1. file:./config

    2. file:./

    3. classpath:/config

    4. classpath:/(默认resource目录下)

properties多环境配置

  • 目录

  • 配置文件内容

yaml多环境配置

注意该方式在springboot 2.4版本之后spring.profiles替换为spring.config.activate.on-profile

  • 通过spring.profiles.active参数,采用spring.config.activate.on-profile定义的标识名称

springboot概述、自动转配原理、yaml语法、多环境配置及文件位置相关推荐

  1. Springboot使用Maven Profile和Spring Profile进行多环境配置

    Springboot使用Maven Profile和Spring Profile进行多环境配置 目的 在实际的项目上,一般会分三种环境dev.test.prod来方便我们的开发和部署,要求我们在开发的 ...

  2. 学习笔记Kafka(七)—— Kafka 与Spark集成 —— 原理介绍与开发环境配置、实战

    一.环境 1.1.Hadoop环境 1.2.Spark环境 1.3.Spark Streaming 1.4.Add Maven Dependencies & 开发流程 Add Scala Fr ...

  3. Springboot之YAML语法

    概述 YAML是 JSON 的超集,因此,它是用于指定分层配置数据的便捷格式.只要 class 路径上有SnakeYAML library,SpringApplication class 就会自动支持 ...

  4. SpringBoot入门-自动配置原理

    3.自动配置原理入门 3.1 引导加载自动配置类 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFil ...

  5. 【SpringBoot】自动装配原理

    [SpringBoot]自动装配原理 文章目录 [SpringBoot]自动装配原理 一.pom.xml 1.spring-boot-dependencies 2.spring-boot-starte ...

  6. yaml语法格式,springboot中yaml的使用

    yaml语法格式,springboot中yaml的使用 yaml 1.yaml语法格式 2.数据类型表示 springboot中yaml的使用 1. @ConfigurationProperties注 ...

  7. SpringBoot之yaml语法、配置文件、多环境切换

    SpringBoot Banner生成网站:https://www.bootschool.net/ascii 在SpringBoot项目的resource目录下,新建一个banner.txt文件,将自 ...

  8. springboot的自动配置原理

    SpringBoot中的默认配置 通过刚才的学习,我们知道@EnableAutoConfiguration会开启SpringBoot的自动配置,并且根据你引入的依赖来生效对应的默认配置.那么问题来了: ...

  9. 面试高频题:springboot自动装配的原理你能说出来吗?

    引言 最近有个读者在面试,面试中被问到了这样一个问题"看你项目中用到了springboot,你说下springboot的自动配置是怎么实现的?"这应该是一个springboot里面 ...

最新文章

  1. php ascii转native,编码转换工具native2ascii的使用
  2. PHP生成PDF完美支持中文,解决TCPDF乱码
  3. python3多进程 pool manager_python多进程multiprocessing Pool相关问题
  4. docker私有仓库harbor配置helm chart仓库(安装helm chart插件)
  5. linux 产生0~100内的随机数
  6. CTF基础理论知识01
  7. 用iptables实现G1手机cmwap代理上http网站[转]
  8. 2020科目一考试口诀_二级建造师考试科目有哪些2020
  9. MIP 2016年终总结
  10. NuGet程序包安装SQLite后完全抽离出SQLite之入门介绍及注意事项,你真的懂了吗?...
  11. 盖茨基金会重发明厕所进展
  12. html range 样式,美化 input range 控制条
  13. HDU1597 find the nth digit【模拟】
  14. 如何实现复杂FPGA设计的时序收敛
  15. 2019年下半年教师资格中学《综合素质》真题与参考答案
  16. 如何批量将JPG图片转换成BMP格式?
  17. 重装系统后,文件数据被格式化如何恢复?
  18. opencv的逻辑运算bitwise详解
  19. LimeSDR srsLTE实验
  20. SQL Server 修改表,不允许保存更改【解决办法】

热门文章

  1. 九度OJ 1177:查找 (字符串操作)
  2. 最新《JPA入门到精通JAVA进阶项目实战》
  3. 电信光猫百兆端口(iTv)联网设置
  4. 模拟火车站售票窗口,开启三个窗口售票,总票数为100张
  5. SuMa++:Efficient LiDAR-based Semantic SLAM
  6. 吐血整理深度学习入门路线及导航【教学视频+大神博客+书籍整理】+【资源页】(2019年已经最后一个月了,你还不学深度学习吗???)
  7. linux操作系统实验教程费翔林,实验一操作系统接口实验.doc
  8. ARouter踩坑指南
  9. DStream实战之Spark Streaming整合fulme实战, Flume向Spark Streaming中push推数据 36
  10. 使用 git 创建补丁和打补丁。