Spring Boot-开发基础2

spring官网

  • 优点
    • 使用嵌入式的Servlet容器,应用无需打包成WAR包
    • starters自动依賴版本与控制版本
    • 自动配置,简化开发,可修改默认值
    • 无需配置XML,无代码生成开箱即用
    • 准生产环境的运行时引用监控
    • 与云计算天然集成

微服务(架构风格)

Martin fowler

一个小型服务是一组小型服务,通过HTTP沟通
单体应用:All In One,把所有功能放在单一进程中,优点是开发测试、部署简单
微服务:将每个功能元素发到一个独立的服务中,通过挂服务器分发服务进行扩展
快速构建应用->spring boot
网站互联互调->spring cloud

  • 学习环境
    • jdk1.8
    • maven3.x
    • IDEA2017
    • SpringBoot 1.5.9.RELEASE
  1. 创建maven项目
  2. 引入starters
  3. 创建主程序
  4. 启动运行

管理springboot应用里面的所有依賴版本,默认不需要写版本

父项目:版本仲裁中心,没有在dependencies里面管理的依賴自然需要声明版本号
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath>../../spring-boot-dependencies</relativePath>
</parent>
导入的依賴

spring-boot-starter:spring-boot场景启动器,帮我们导入了web模块正常运行所依賴的组件

Spring Boot将所有的功能常见抽取出来,做成一个个starters(启动器),只需要在项目里面引入这些starter相关场景相关依賴导入

主程序类,主入口类

  • @SpringBootApplication标注一个主程序类、主配置类,说明这是一个Spring Boot应用
    他是组合注解
    • @SpringBootConfiguration:Spring Boot的配置类
    • 标注在某个类上,表示类上是一个Spring Boot的配置类
      • @Configuration:配置类上来标注这个注解
      • 配置类—配置文件;配置类也是容器中的一个组件@Componetn
    • @EnableAutoConfiguration:告诉springboot开启自动配置功能
    • @AutoConfigurationPackage:自动配置包
      • @Import(AutoConfigurationPackage.Registrar.class)给容器导入组件
      • 将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中
      • 会给容器中导入非常多的自动配置类(xxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件
      • Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作
        将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器

J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar

Spring Boot配置

  1. 配置文件,配置文件名是固定的
  • application.properties
  • application.yml
    作用:修改SpringBoot自动配置的默认值

加载顺序
配置原理

YAML

(YAML Ain‘t Markup Language)是一个标志语言

  1. YAML基本语法
  • 使用缩进表示层级关系
  • 缩进时不允许使用tab键,只允许使用空格,空格的缩进控制层级关系
  • 缩进的空格数目不重要,只要相同层级的元素左对齐即可
  • 大小写敏感
  1. 支持的三种数据结构
  • 对象:键值对的组合、(Map、对象)
friends: {lastName:zhangsan,age:18}
  • 数组:一组按次序排列的值、(List、Set)
    • 用-值表示数组中的
    pets: 
    	- cat
    	- dog
    	- pig
    行内写法:
    pets:[cat,dog,pig]
    
  • 字面量:单个的、不可再分的值(数字、字符串、布尔),字符串默认不用加上单引号或双引号
    • “”:双引号,不会转义字符里面的特殊字符,特殊字符会表示的意思
    • ‘’:单引号,会转义特殊字符,特殊字符最终只是一个普通的字符串数据

key:(空格)value

配置文件值注入

  1. 在bean文件中添加注解@ConfigurationProperties(prefix=“person即yml的数据”)
  • 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
  • 配置文件中哪个下面的所有属性进行一一映射
  • 在pom.xml导入配置文件处理器,配置文件进行绑定就会有提示
作用:生成配置文件的元数据信息
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-configuration-processor</artifactId>
     <scope>true</scope>
</dependency>

只有这个组件时容器中的组件才能提供@ConfigurationProperties功能

当输出乱码时的解决方法:
setting->File Encodings
乱码

@value("${person.last-name}")获取值

相当于

<bean class="Person">
	<property name="lastName" value="字面量/${key}从环境配置、配置文件获取值/#{SpEL}"></property >
</bean>
@ConfigurationProperties
  • 与@Bean结合为属性赋值、默认从全局配置文件中获取值
  • @PropertySource(只能用于properties文件)结合读取指定文件:加载指定文件
  • @Validated进行文件值校验,@NotNull、@Valid
  • @ImportResource:导入Spring的配置文件,让配置文件里面的内容生效
@ImportResource(locations={"classpath:beans.xml"})
导入Spring的配置文件让其生效

区别

@ConfigurationProperties@value
功能批量注入配置文件中的属性一个个指定
松散绑定(松散语法)支持不支持
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

应用场景

  • 只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
  • 专门编写一个javaBean和配置文件进行映射,直接使用@ConfigurationProperties

== 什么是松散绑定==
属性名匹配规则

  • person.firstName:使用标准方式
  • person.first-name:大写用-
  • person.first_name:大写用_
  • PERSON_FIRST_NAME:推荐系统属性使用这种写法

SpringBoot推荐给容器中添加组件的方式,使用全注解方式
@Bean:将方法的返回值添加到容器中,容器中的组件默认的id就是方法名

配置文件占位符

RandomValuePropertySource:配置文件中可以使用随机数
r a n d o m . v a l u e 、 {random.value}、 random.value{random.int}、 r a n d o m . v a l u e 、 {random.value}、 random.value{random.long}、 r a n d o m . i n t ( 10 ) 、 {random.int(10)}、 random.int(10){random.int[1024,65536]}

  • 在配置文件中引用前面配置过的属性(优先级前面配置过的这里能用)
  • ${app.name:默认值}来指定找不到属性的默认值

Profile

Spring随不同环境不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境

  1. 多profile文件形式
  • 格式:application-{profile}.properties/yml
    • application-dev.properties、application-prod.properties
  1. 多profile文档块模式:yml文件用—分成不同文档块,在用spring:profiles:dev指定属于开发环境或spring:profiles:active:dev激活开发环境
  2. 激活方式
  • 命令行: java -jar jar包的名字 --spring.profiles.active = dev
  • 配置文件:在配置文件中指定 spring.profiles.active = dev
  • jvm参数: -Dspring.profiles.active = dev
    JVM参数
    命令行

配置文件加载位置

  • spring boot启动会扫描以下位置的application.properties或application.yml文件作为Spring boot的默认配置文件
    • 根目录:file:./config/
    • file:./
    • classpath:/config/
    • classpath:/
      以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容

SpringBoot会从这四个位置全部加载主配置文件互补配置

server.port=8081
#配置项目的访问路径
server.context-path=/boot02

通过spring.config.location来改变默认配置,项目打包好之后使用命令行参数的形式,启动项目时指定配置文件的新位置;指定配置文件和默认加载的配置文件共同起作用形成互补配置

外部配置加载顺序

  1. 命令行参数
    所有的配置都可以在命令行上进行指定
    java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc多个配置用空格分开; --配置项=值

  2. 来自java:comp/env的JNDI属性

  3. Java系统属性(System.getProperties())

  4. 操作系统环境变量

  5. RandomValuePropertySource配置的random.*属性值
    由jar包外向jar包内进行寻找; 优先加载带profile

  6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    再来加载不带profile

  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件

  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件

总结:优先加载带profile,再加载不带profile。由jar包外向jar包内寻找。会先加载项目打包后的jar包统一目录下的配置文件



11. @Configuration注解类上的@PropertySource
12. 通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;
外部配置文件
优先级从高到低

自动配置原理

配置文件能写什么?怎么写?

  1. 查看HttpEncodingAutoConfiguration
  2. 通用模式
    • xxxAutoConfiguration:自动配置类
    • xxxProperties:属性配置类
    • yml/properties文件中能配置的值来源于[属性配置类]
  3. 几个重要注解
    • @Bean
    • @Conditional
  4. –debug查看详细的自动配置报告

配置文件能配置的属性参照

原理:1.从main方法启动,加载springboot配置类,开启自动配置功能
@EnableAutoConfiguration
将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到容器中

HttpEncodingAutoConfiguration
所有配置文件中配置的属性都在xxxProperties类中封装着。配置文件能配置什么可以参照这个功能对应的属性类

HttpEncodingAutoConfiguration(Http编码自动配置

根据不同条件判断,决定这个配置类是否生效?

@Configuration    // 配置类
@EnableConfigurationProperties(HttpEncodingProperties.class) // 开启属性注入,启动指定类
ConfigurationProperties功能:将配置文件中对应的值和HttpE能从订货Properties绑定起来
HttpEncodingProperties加入到ioc容器中
spring.http.encoding.enabled=true
spring.http.encoding.cahrset=utf-8
spring.http.encoding.force=true
@ConditionalOnWebApplication //Spring底层@Configuration注解,根据不同的条件,如果满足指定条件,整个配置类里面的配置生效,判断当前应用是否是web应用,如果是当前配置类生效

@ConditionalOnClass(CharacterEncodingFilter.class) // 判断当前项目有没有这个类
CharacterEncodingFilter:SpringMVC中进行乱码解决的过滤器

@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)// 当设置spring.http.encoding=enabled的情况下,如果没有设置默认是true,即符合条件。判断配置文件中是否存在某个配置"spring.http.encoding.enabled,及时不配置也是默认生效的
@Bean给容器中添加一个组件,这个组件的某些值需要从properties中获取

一旦这个配置类生效,配置类就会给容器添加各种组件,这些组件的属性是从对应的properties类中回去的,这些类里面的每个属性又是和配置文件绑定的

springboot的配置原理总结

1)、SpringBoot启动会加载大量的自动配置类
2)、按需求看SpringBoot默认写好的
3)、自动配置类中到底配置了哪些组件
4)、给容器中自动配置类添加组件时,会从properties类中获取某些属性,可在配置文件中指定属性的值

xxxAutoConfiguration:自动配置类
给容器中添加组件

xxxProperties:封装配置中的相关属性

@Conditional(OnClassCondition.class):判断条件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值