SpringBoot学习笔记一

SpringBoot学习笔记一

一、入门

1、Spring Boot简介

简化Spring应用开发的一个框架

整个Spring技术栈的整合

J2EE开发的一站式解决方案

2、微服务

Martin Fowler

微服务是一种架构风格

一个应用应该是一组小型服务:可以通过HTTP的方式进行互通

每一个功能元素最终都是一个可独立替换和独立升级的软件单元

详细参照微服务文档

3、环境准备

  • jdk1.8
  • maven3.x
  • IntellijIDEA2019
  • SpringBoot 2.2.2.RELEASE

Maven设置

给maven的setting.xml配置文件的profiles标签添加jdk相关profile

4、SpringBoot HelloWorld

一个功能:浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串;

1、创建一个,maven工程;

2、导入依赖spring boot相关依赖

3、编写一个主程序:启动Spring Boot应用

4、编写相关的Controller、Service

5、运行主程序测试

6、简化部署

加入插件spring.boot.maven.plugin,将应用打成jar包,直接使用java -jar的命令进行执行;

5、Hello World探究

  • POM文件

父项目

spring.boot.starter.parent
其父项目
spring.boot.dependencies 管理SpringBoot中的所有依赖

spring-boot-starter-web

spring-boot-starter:spring-boot场景启动器:导入web模块正常运行所依赖的组件
需要什么功能就导入相应的场景启动器

  • 主程序类,主入口类

@SpringBootApplication

标注在某个类上,表示是一个SpringBoot的主配置类,SpringBoot运行这个类的main方法来启动SpringBoot应用;

@SpringBootConfiguration :SpringBoot的配置类

标注在某个类上,表示是一个SpringBoot的主配置类

@Configuration:配置类上标注这个注解

配置类=配置文件,配置类也是容器中的一个组件@Component

@EnableAutoConfiguration :开启自动配置功能

@AutoConfigurationPackage:自动配置包

@Import(AutoConfigurationPackages.Registrar.class):将著配置类所在包及下面所有子包里面的所有组件扫描到Spring容器;

@Import(EnableAutoConfigurationImportSelector.class):将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器当中;会给容器导入大量自动配置类(xxxAutoConfiguration),从而自动配置场景所需组件。

SpringBoot在启动时从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,从而进行自动配置工作。

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

6、使用Spring Initializer快速创建SpringBoot项目

使用IDE的Spring项目创建享导快速创建SpringBoot项目,选择所需模块,向导联网创建Spring Boot项目。

  • resources文件夹中目录结构
    • static:保存所有静态资源:js css images;
    • templates:保存所有的模板页面:(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎
    • application.properties:SpringBoot应用的配置文件;

二、配置文件

1、配置文件

SpringBoot使用全局配置文件,配置文件名固定

  • application.properties
  • application.yml

可以修改SpringBoot自动配置的默认值

yml以数据为中心

    server:
        port:8001

xml

    <server>
        <port>8001</port>
    </server>

2、YAML语法

  • 基本语法

    k:(空格)v :表示一个键值对

    以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一层级

    属性和值大小写敏感

  • 值的写法

    字面量:普通的值 (数字,字符串,布尔)

    键值对直接写

    字符串默认不加引号,单引号不会转义,双引号会转义

    对象、Map:

    person:
      lastName: zhangsan
      age: 20
    person:{lastName: zhangsan,age: 18}

    数组:

    - 值表示数组的一个元素

    pets:
     - cat
     - dog
     - pig
    pets: [cat,dog,pig]

3、配置文件的注入

在yml配置文件中进行配置,在javaBean中进行绑定(将配置的值映射到Bean)

@ConfigurationProperties:告诉SpingBoot将本类中的所有属性和配置文件中相关的配置进行绑定

prefix=”person“,配置文件的person项的所有属性进行映射

@Component 配置映射只对容器的组件有效

@Component
@ConfigurationProperties(prefix="person")
  • properties配置文件在IDEA中默认utf-8编码可能会出现乱码,需要设置为在编译时转为ascii码
  • @Value和@ConfigurationProperties获取值有区别
  • 配置文件注入值数据校验@Validated
  • @PropertySource&&@ImportResource,前者加载自定义的配置文件,后者将自定义的Spring相关配置生效
@PropertySource(value={"classpath:person.properties"})
@ImportResource(location={"calsspath:bean.xml"})

SpringBoot推荐使用全注解的方式给容器添加组件

  • 配置类=Spring配置文件
  • 使用@Bean给容器添加组件
@Configuration //配置类
publie class MyAppConfig{
    //将方法的返回值添加到容器中,组件默认id为方法名
    @Bean
    public HelloService helloService(){
        //
        return new HelloService(); 
    }
}

4、配置文件占位符

  • 随机数
${random.long}、${random.int(10)}、${random.value}、${random.int[1024,65536]}
  • 占位符获取之前配置的值,如果没有可以使用指定默认值

5、Profile

  • 多Profile文件

    主配置文件名可以是application.(profile).properties/yml

    Spring默认使用application.properties的配置

  • yml支持多文档块方式

    server:
      port:8001
    spring:
      profiles:
          active:dev
    ---
    server:
      port:8002
    spring:
      profiles:dev
    ---
    server:
      port:8003
    spring:
      profiles:prod #指定配置环境
  • 激活指定profile

    在配置文件中指定spring.profile.active=(profile)

    命令行:

    java -jar spring-boot-SNAPSHOT.jar --spring.profiles.active=dev;

    运行时传入参数

    虚拟机参数

    -Dspring.profiles.active=dev

6、配置文件加载位置

SpringBoot启动会扫描以下位置的application.properties/yml文件作为默认配置文件

file:/config/

file:/

classpath:/config/

classpath:/

优先级由高到低,配置互补,相同配置项高优先级会覆盖低优先级

也可通过部署运行时在命令中传参数改变默认配置spring.config.location

7、外部配置加载顺序

优先级由高到低,配置互补,相同配置项高优先级会覆盖低优先级

  • 命令行参数

    -- 配置项=值

  • java系统属性

  • 操作系统环境变量

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

  • jar包内带profile的配置文件(application.{profile}.properties或application.yml(有spring.profile))

  • jar包外的配置文件(application.properties或application.yml(没有spring.profile))

  • jar包内的配置文件(application.properties或application.yml(没有spring.profile))

    外部:打成的jar同一文件夹下

    内部:项目文件下

  • @Configuration注解类上的@PropertySource

8、自动配置原理

  • SpringBoot启动时加载主配置类,开启自动配置功能@EnableAutoConfiguration

  • @EnableAutoConfiguration作用

    利用EnableAutoConfigurationImportSelector给容器中导入一些组件 :可以查看select Imports()方法的内容

    List configurations=getCandidateConfigurations(annotationMetadata,attributes);获取候选配置

SpringFactoriesLoader.loadFactoryNames();
扫描所有jar包类路径下META-INF/spring.factories
把扫描到的这些文件的内容包装成properties对象
从properties中获取到EnableAutoConfiguration.class类名对应的值,然后把他们添加到容器中 

将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到了容器中;

  • 每一个自动配置类进行自动配置功能

  • 所有 在配置类中能配置的属性都是在xxxProperties类中封装着;

精髓

  • SpringBoot启动会加载大量的自动配置类
  • 我们需要看项目所需功能有没有SpringBoot默认写好的自动配置类
  • 再看自动配置类中到底配置了那些组件
  • 给容器自动配置类添加组件时会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的的值

细节

  • @Conditional派生注解:注解指定的条件成立,才给容器添加组件,配置里的内容才生效

    @Conditional派生注解 作用
    @ConditionalOnJava java版本是否符合要求
    @ConditionalOnBean 存在指定Bean
    @ConditionalOnMissingBean 不存在指定Bean
    @ConditionalOnExpression 满足SpEL表达式指定
    @ConditionalOnClass 有指定类
    @ConditionalOnMissingClass 没有指定类
    @ConditionalOnSingleCandidate 只有一个指定Bean
    @ConditionalOnProperty 指定属性是否有指定值
    @ConditionalOnResource 类路径下是否存在资源文件
    @ConditionalOnWebApplication 当前是Web环境
    @ConditionalOnNotWebApplication 当前不是Web环境

    自动配置类必须在一定条件下才能生效

    通过在配置文件中启用debug=true属性,让控制台自动打印配置报告,可以很方便知道哪些自动配置类生效