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. CCNA认证指南note 01
  2. 类与接口(四)方法重载解析
  3. 分析JDK中的Runtime的单例设计模式以及使用小例子
  4. 打印图形(1)(C+Java)
  5. 枚举类型用法_Mybatis-plus常见用法总结三
  6. 机器学习-朴素贝叶斯分类
  7. mysql 单机_mysql单机多实例——方法1
  8. UDS协议入门之10服务
  9. 计算机桌面图标右上角出现双箭头符号,建议这样去掉桌面快捷图标的小箭头-word箭头符号...
  10. 商业智能和分析软件市场现状及发展趋势分析-
  11. 华众 mysql_华众虚拟主机管理系统HZhost三大常见错误!
  12. Spark Transformation算子->subtract
  13. Python PyAutoGUI模块自动化控制鼠标和键盘
  14. Python爬虫 Selenium实现自动登录163邮箱和Locating Elements介绍
  15. 水果店怎么搞活动方案,水果店促销活动方案
  16. 给一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体右移到右半区,右半区整体移动到左边。
  17. PyTorch深度学习-跟着小土堆学习
  18. html5如何快速选择工具使用技巧,用PS快速选择工具抠图的方法
  19. 一个人能够哲学思考的条件
  20. 2016区域赛前冲刺训练

热门文章

  1. 路由器如何恢复出厂设置
  2. TTL肖特基触发器是什么?
  3. python判断字母大小写_用python如何判断字符的大小写
  4. 「实战案例」基于Python语言开发的信用评分卡
  5. split函数python统计英文单词_Python实现统计英文单词个数及字符串分割代码
  6. Springboot+Mysql在线众筹系统
  7. MediaStore数据库分析
  8. git使用遇到的问题
  9. cs/bs以及优缺点
  10. android平板开箱,安卓平板不行了吗?小米平板4乞丐版开箱体验