SpringBoot2学习

SpringBoot是什么?

springBoot是整合spring技术栈的一站式框架同时也是简化技术栈的快速开发脚手架

SpringBoot优点

1.创建独立的Spring应用
2.内嵌web服务器不再需要部署Tomcat打war包,jar包即可运行项目
3.自动Start依赖,简化了导入许多jar包
4.自动配置Spring以及第三方功能(mysql、redis)
5.提供生产级别的监控、健康检查及外部化检查
6.无代码胜场、无需编写 xml

微服务背景故事

英文原文链接
中文链接

云原生作为下一步的学习计划

https://www.zhihu.com/topic/20054173/hot

SpringBoot文档架构

image.png

Maven的就近原则

因为springboot的父类
<artifactId>spring-boot-starter-parent</artifactId>
父类里包含了很多的依赖并且带有版本
<artifactId>spring-boot-dependencies</artifactId>

想要修改版本并且不受父类中的依赖影响是因为MAVEN的“就近原则”与”约定大于配置“

    <properties>
        <mysql.version>5.0.43</mysql.version>
    </properties>

Spring Boot Reference Documentation

Using Spring Boot

SpringBoot给我们简化的依赖管理体现

spring-boot-starter-*的含义

*代表某种场景,有了前缀就可以吧web场景所依赖的jar引入

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

springboot的核心依赖
spring-boot-starter

image.png

springboot的第三方依赖
*-spring-boot-starter

SpringBoot是如何IOC控制反转的

    public static void main(String[] args) {
        //返回Springboot自带的IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(GoodveryApplication.class, args);
        //2.查看容器里面的组件
        String[] names = run.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }
image.png

由此得出springboot帮我们配置好了所有web开发的场景(eg:解决了字符编码的问题)

springboot自动配置了包的扫描

在Spring Boot Reference Documentation - Using Spring Boot - Structuring Your Code - Using the “default” Package中可得下图

在主程序下面的包与包下面的子包里面的组件都会被默认扫描(controller包就可不配置扫描即可重定向与转发)

也就是说主程序需要放在最里面的文件夹不然就扫描不到

image.png

如需要自定义主程序放包的位置则需要配置该注解↓

方式1.png

由于@SpringBootApplication =
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan可这样写↓


方式2.png

一个application.properties里面具有所有配置的默认值

默认配置最终映射到MultipartProperties
配置文件的值最终会绑定每个类上,这个类会在容器中创建对象

按需加载所有自动配置项

非常多的starter
引入了那些场景,那些场景就会自动开启。
springboot的所有自动配置功能都在下面这个包


image.png

该包的使用场景↓


image.png

开启改包的使用↓
image.png

@Configuration//告诉SpringBoot这是一个配置类 == 配置文件相当于免去xxx.xml文件
@Bean //给容器中添加组件,以方法名作为组件的id,返回类型是组件的类型,返回值,就是组件在容器中的实例。
@Bean("xxx")
配置类里面使用该注解标注在方法上给容器注册组件,默认也是单实例的


无论获取多少次都是一样的,所以是默认是单实例的
![](http://upload-images.jianshu.io/upload_images/23643532-20d7d48d37796f22.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/871/q/50

spring5新特性,springboot2最大的更新 spring5新特性,springboot2最大的更新

@Bean(proxyBeanMethod = true)full模式代理对象调用方法
使其多次调用同一方法方法保持组件单实例
@Bean(proxyBeanMethod = false)lite模式
如果组件之间没有依赖则设置为false会更快,因为跳过了检查配置类里面有没有一样的springboot启动更快

@import用法


条件装配

@conditional

eg:@Conditionalbean(name="xxx")当存在xxx这个名称的bean下面的方法才会生效

@ImportResource("classpath:xxx.xml")
该注解使用场景在因为旧版本的xxx.xml配置很多,而需要重新解析放到容器中就可以重新读取该xml文件

配置绑定,将properties中的配置绑定到javabean中

方法1
@ConfigurationPerproties(prefix=“mycar“)
将.properties配置文件中的mycar.aaa/mycar.sss一一对应到@Component加载到容器中的实体类的属性aaa/sss一一对应
再通过@Autowired将实体类自动注入,写一个方法返回实体类绑定配置文件的内容

方法2
@ConfigurationPerproties(prefix=“mycar“)绑定配置文件的前缀
@EnableConfigurationProperties(实体类名.class)

自动配置原理入门

引导加载自动配置类

@SpringBootApplication
//是@SpringBootApplication的子集

//相当于@Configuration :代表当前为一个配置类
@SpringBootConfiguration
@EnableAutoConfiguration
//:指定扫描那些spring注解
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication 
//是@EnableAutoConfiguration的子集

@EnableAutoConfiguration:重要注解
@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationImportSelector.class)//给容器中创建该类型的组件
public @interface EnableAutoConfiguration 
//是@AutoConfigurationPackage的子集

@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
//根据@Import(AutoConfigurationPackages.Registrar.class)可知注册了哪些一系列的组件

    static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {

        @Override
        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
        }

        @Override
        public Set<Object> determineImports(AnnotationMetadata metadata) {
            return Collections.singleton(new PackageImports(metadata));
        }

    }

由下图可知Springboot的主程序xxxApplication将下面的所有组件注册进来


由图可知是由于register得到某个包将包下面的所有组件注册进来.png
@Import(AutoConfigurationImportSelector.class)之AutoConfigurationImportSelector解析
AutoConfigurationImportSelector个利用该方法批量导入一些组件.png

调用容器所需的配置类.png

利用工厂加载public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)得到所有所需组件.png

根据SpringFactoriesLoader得到里面加载组件的位置.png

加载META-INF/spring.factories位置的内容.png

spring-boot-test-autoconfigure-2.4.3.jar也有,由次可知文件写死了springboot以启动所要加载的配置类.png

上述可知:springboot是按需(按照@ConditionalOnClass("xxx")这种按照条件装 配规则)加载自动配置
框架 = 注解 + 反射 + 算法

修改默认配置

SpringBoot默认在底层配好所有组件,你想用就在配置类加@Bean装配你的方法.png

总结:
Spring先加载所有的配置类
每个自动的配置类按照条件生效
生效的配置类给容器装配许多组件
容器有容器就代表组件生效,该组件的功能就生效
用户自定义的组件且容器组件生效的则用户配置的组件优先

不看文档怎么知道.Properties配置有哪些属性(以缓存相关为例cache)
1.打开该自动配置的包


打开该自动配置的包.png

2.打开cache类


image.png

3.根据该properties绑定
image.png

4.然后就知道以这个为开头启动cache配置
image.png
image.png

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓由上述的SpringBoot配置原理得出使用SpringBoot最佳实践↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

引入场景依赖

https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter

image.png

查看自动配置哪些

1.查看包

image.png

image.png

2.自己分析

配置文件配置 debug=true生成配置报告启动项目控制台看到下图内容就是不生效的


image.png

是否需要修改:

参照文档修改配置项

默认resources名称为banner点jpg、自定义名称需要参考文档中的配置项.png

自定义加入或者替换组件

@Bean、@Component

自定义器 xxxCustomizer;

...

Lombock简化开发

image.png

@slf4j注解的使用

image.png

热部署的使用之(Restart)

image.png

使用此快捷键即可热部署一次.png

热部署的使用之(Reload) JRebel

Spring Initializr快速创建SpringBoot项目

image.png

SpringBoot2核心技术-核心功能SpringBoot2核心技术-核心功能

核心功能指南.png

配置文件

.properties

.yml既是也不是标记语言的语言,适合以数据为中心的配置文件

开启yaml文件自动补全.png

基本语法

key: value kv之间有空格
大小写敏感
缩进不允许使用tab,只允许空格
缩进的空格不重要,只要相同的层级的元素左对齐即可
‘#’表示注释
''与""表示字符串内容会被转义/不转义


1.png

2.png

3.png

.propertie与.yaml配置文件用法对比

配置propertie

@ConfigurationProperties(prefix = "person")注解用法案例
propertie.png
propertie.png

配置yaml

yaml.png
语法实操1.png
数组里面写对象
语法实操2.png
''与""表示字符串内容会被转义/不转义.png
使yaml有语法提示的依赖.png

SpringBoot之Web开发SpringBoot之Web开发SpringBoot之Web开发

导读图.png

Spring Boot Features

Profiles, Logging, Security, Caching, Spring Integration, Testing, and more.(配置文件,日志记录,安全性,缓存,Spring集成,测试等)

Developing Web Applications(之使用Web应用)

Static Content 静态资源的访问
静态资源目录

called /static (or /public or /resources or /META-INF/resources
通过项目根路径 + 静态资源名即可访问到
底层实现访问到静态资源的实现原理


原理:静态映射/**,请求进来,先找Controller没有再找静态资源管理器.png

为了给静态资源放行所以加此前缀.png

image.png

实操图示.png

webjars将静态资源导入依赖

webjars将静态资源导入依赖.png

自定义静态资源路径.png

webjars.org
webjars官方文档解释.png

webjars访问地址.png

Welcome Page欢迎页的使用

问题:如果配置了静态资源的访问前缀就不可以使index.html被默认访问


Welcome Page.png

标签页默认存放位置.png

默认配置标签页图标才会生效.png

获取.ico的方法.png

静态资源配置原理

  • SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类)


    image.png
  • SpringMVC功能的自动配置类 WebMvcAutoConfiguration,使其生效注解如下。
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
      ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {

WebMvcAutoConfiguration 实现的功能:

SpringMVC兼容Rest风格.png

表单过滤器.png

给容器配了什么?

  @Configuration(proxyBeanMethods = false)
  @Import(EnableWebMvcConfiguration.class)
  @EnableConfigurationProperties({ WebMvcProperties.class,
          org.springframework.boot.autoconfigure.web.ResourceProperties.class, WebProperties.class })
  @Order(0)
  public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {

配置文件的相关属性与xxx进行了绑定。


上面的WebMvcProperties.class绑定“spring.mvc”.png

上面的ResourceProperties.class绑定"spring .resources".png

只有一个有参构造器

  • 有参构造器所有参数的值都会从容器中确定


    WebProperties webProperties获取“spring.resources”绑定的所有的值的对象||WebMvcProperties mvcProperties获取了“spring.mvc”绑定的所有的值的对象.png

资源处理的默认规则

WebMvcAutoConfiguration.png

image.png

欢迎页的默认规则配置

欢迎页的默认规则配置.png

欢迎页的默认规则配置代码解析,因为路径已经写死若修改了静待资源的前缀就会找不到index.png

请求参数处理:配置文件开启RestFul风格请求spring.mvc.hiddenmethod.filter.enabled=true

红框为请求映射.png

restful风格请求的方式.png

这么写delete、post请求默认为get请求.png

在springboot中如何支持get、post之外的请求 在WebMvcAutoConfiguration.java中配置好了

image.png

获取前端name="_method"的值

如果前端请求由name="_method"的值则获取该请求.png

正确的获取DELETE/PUT请求写法.png

由name = “enable” 代码可知需要手动开启RestFul风格请求.png

Rest原理(表单提交要使用REST的时候)

  • 表单提交会带上_method = PUT


    image.png

    请求过来会被OrderedHiddenHttpMethodFilter拦截


    image.png

    当请求为POST且正常时进入方法体.png

    如果前端请求由name="_method"的值则获取该请求.png

    如果前端请求由name="_method"的值则获取该请求.png

    兼容以下请求.png

    兼容以下请求.png

    最终请求写法.png

    Rest原理总结.png
个人总结:restful API请求方式默认有get/post请求,如果使用类似DELETE请求需要手动启动配置,WebMVCAutoConfiguration就会启动HiddenHttpMethodFilter方法,此方法判断是否为POST请求并且是否正常,获取到兼容的POST请求中_method的值,HttpMethodRequestWrapper重写并调用getmethod的方法。

请求处理修改默认的_method

1.png

2.png

请求处理-映射请求执行原理源码解析 P28重新看整不明白

1.png

2.png

3.png

4.png

5.png

请求处理-常用参数注解使用

1.png

2.png

3.png

4.png

4.png

所有实例解析.png
实例解析1.png

实例解析1返回结果.png

实例解析2.png

实例解析2返回单个或所有请求头.png

实例解析2返回结果.png

实例解析3.png

实例解析3返回结果.png

实例解析4获取cookie的值和获取该值的信息.png

实例解析4.png

实例解析5.png

实例解析5.png

实例解析5返回结果.png

实例解析6.png

实例解析返回结果6.png

实例解析7.png

实例解析7.png

实例解析7.png

使用矩阵变量的功能配置7.1.png

使用矩阵变量的功能配置7.2.png

实例解析7矩阵变量写法1返回结果.png

实例解析7矩阵变量写法2.png

实例解析7矩阵变量写法2返回结果.png

请求处理 - 源码分析 - 各种类型参数解析原理 P32

image.png

image.png

image.png

image.png

image.png

会用就行从P33跳过

请求处理 - 源码分析 - Model、Map原理

1.png

2.png

3.png

4.png

5.png

请求处理 - 源码分析 - 自定义参数绑定原理

1.png

2.png

3.png

4.png

5.png

6.png

请求处理 - 源码分析 - 自定义Converter原理

1.png

2.png

3.png

4.png

5.png

p37响应处理 - 源码分析 - ReturnValueHandler原理 p38跳过

1.png

2.png

3.png

p39响应处理 - 源码分析 - 内容协商原理(在不同情况返回不同的内容XML、json、xml要根据浏览器的接受能力)

1.png

2.png

3.png

4.png

5.png

p40响应处理 - 源码分析 - 基于请求参数的内容协商原理

1.png

p41响应处理 - 源码分析 - 自定义MessageConverter (不懂他的config文件跳过)

1.png

2.png

3.png

4.png

p42响应处理 - 源码分析 - 浏览器与Postman内容协商完全适配(不懂跳过)

基于请求头/请求参数.png

image.png

p43视图解析-Thymeleaf初体验 (后端人员使用的模板引擎,缺点是不是高性能的模板引擎只适用于单体应用,高并发不适用,所以暂且不学) p44 p45 p46 p47 P48 P49跳过

image.png

image.png

image.png

p51文件上传-单文件与多文件上传 p52跳过

1.png

2.png

3.png

4.png

5.png

6.png

7.png

p52 错误处理-springboot默认错误处理机制 p53 - p55跳过

image.png

image.png

image.png

image.png

自定义异常页面.png

异常页面存放位置.png

原生组件注入-原生注解与spring方式注入 (Servlet Filter Listener)

1.png

官方文档.png

image.png

有servlet请求就会被扫描到.png

Filter.png

Listener1.png

推荐使用RegisterBean方式.png

RegisterBean方式1.png

RegisterBean方式2.png

Listener方式.png

image.png

p57原生组件注入 - 源码分析 -DispatcherServlet注入原理

跳过的p57.png

修改Servlet访问路径以/mvc/开始.png

image.png

P58嵌入式Servlet容器 - 源码分析 -切换web服务器与定制化

官方文档说明.png

支持的web服务器.png

原理.png

支持的web服务器.png

先排除tomcat再加入其他服务器的依赖即可使用.png

image.png

image.png

image.png

image.png

image.png

数据访问 - 数据库场景的自动配置分析与整合测试

数据源自动配置-HikariDataSource

0.png

1.png

2.png

3.png

4.png

5.png

6.png

7.png

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=utf8&&serverTimezone=GMT
jdbc.username=root
jdbc.password=0000

https://www.pianshen.com/article/5589774588/ (解决密码0000为什么会报错)

image.png

数据源自动配置-Druid数据源

1.官方文档
https://github.com/alibaba/druid
2.配置数据源

image.png

绑定配置文件配置Druid.png

测试数据源类型.png

image.png

---------------------------------学了个寂寞↑↑↑↑↑↑↑---------------------------------------

p62简化版druid配置方式

1.导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
2.自动配置:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter

image.png

image.png

image.png

常用配置2.png

整合mymatis操作注解版(属于第三方技术所以springboot官网没有)

整合官网:https://github.com/mybatis/spring-boot-starter

image.png

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
image.png

“resultType是针对于拿数据的时候用的,paramType是针对于存数据的时候用的”,虽然对,但说法有点不妥,很容易让新人产生误解,比如说我第一眼就以为要从resultType的值里拿数据,要把插入语句的结果保存到paramType中。 我的理解是:resultType是sql语句查询结果集的封装类型,也就是说把sql查询的结果封装在bean里返回回去,是存数据用的。 paramType是从传过来的Bean中取数据放进例如insert语句的values中当实参用,是取数据用的。

由于配置了驼峰命名是属于yaml文件所以不需要mybatis-config.xml命名共存,其中mybatis.configuration配置mybatis全局配置:在MybatisProperties-configurationProperties中可以看到配置的属性

总结.png

全注解版配置mybatis

快速开始网址:https://github.com/mybatis/spring-boot-starter/wiki/Quick-Start

image.png

主键id自增

主键id自增无XML配置写法.png

一劳永逸不需要在每个xxx.mapper文件标注@Mapper注解的方法

image.png

image.png

mybatis-Plus整合 完成CRUD功能

官方学习快速上手:https://mp.baomidou.com/

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>
已经整合所以不用这些依赖.png

mybatisPlus自动配置原理.png

使用mybatisPlus只需要拓展这个mapp即可.png

当使用mybatisplus时实体类需要映射所有的属性,当有临时的属性未映射则需要加该注解.png

若数据库的表名与实体类名不一致需要该注解解释.png

image.png

mybatis-plus实现分页

mybatisplus自动生成业务1.png

mybatisplus自动生成业务2;user为返回数据类型.png
    @GetMapping("/tab")
  //@RequestParam(value = "pn",defaultValue = "1")请求前端的当前页,默认为第一页为当前页
    public String tab(@RequestParam(value = "pn",defaultValue = "1")Integer pn, Model model){
        //返回页面列表
        List<User> list = userService.list();

        //分页查询数据
        Page<User> userPage = new Page<>(pn, 2);

        //分页查询结果
        IPage<User> page = userService.page(userPage, null);

        //获取当前页
        long current = page.getCurrent();

        //获取总页数
        long pages = page.getPages();

        //获取总记录数
        long total = page.getTotal();

        //分页对象记录列表
        List<User> records = page.getRecords();

        model.addAttribute("page",page);
        return "table/dynamic_table";
    }
上一页下一页.png

mybatisplus官方分页插件.png

分页条.png

分页条.png

数据访问 - CRUD功能试验 - 删除用户完成

1.png

2.png

数据访问-准备阿里云redis环境

Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 [字符串(strings)](http://www.redis.cn/topics/data-types-intro.html#strings), [散列(hashes)](http://www.redis.cn/topics/data-types-intro.html#hashes), [列表(lists)](http://www.redis.cn/topics/data-types-intro.html#lists), [集合(sets)](http://www.redis.cn/topics/data-types-intro.html#sets), [有序集合(sorted sets)](http://www.redis.cn/topics/data-types-intro.html#sorted-sets) 与范围查询, [bitmaps](http://www.redis.cn/topics/data-types-intro.html#bitmaps), [hyperloglogs](http://www.redis.cn/topics/data-types-intro.html#hyperloglogs) 和 [地理空间(geospatial)](http://www.redis.cn/commands/geoadd.html) 索引半径查询。 Redis 内置了 [复制(replication)](http://www.redis.cn/topics/replication.html),[LUA脚本(Lua scripting)](http://www.redis.cn/commands/eval.html), [LRU驱动事件(LRU eviction)](http://www.redis.cn/topics/lru-cache.html),[事务(transactions)](http://www.redis.cn/topics/transactions.html) 和不同级别的 [磁盘持久化(persistence)](http://www.redis.cn/topics/persistence.html), 并通过 [Redis哨兵(Sentinel)](http://www.redis.cn/topics/sentinel.html)和自动 [分区(Cluster)](http://www.redis.cn/topics/cluster-tutorial.html)提供高可用性(high availability)。
官网学习:http://www.redis.cn/

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
搭建Redis阿里云.png
底层.png

测试redis.png

jedis为操作redis的客户端工具.png

配置redis.png
使用Redis记录请求执行的次数
1.由于有@Configuration所有将拦截器用@Autowired注入进来.png

2.redis拦截所有请求,excludePathPatterns除外.png

3.拦截器前置方法操作Redis,将uri作为key保存到redis中.png

4返回结果到前端.png

5将结果赋值.png

单元测试

官方文档:https://junit.org/junit5/

1概念.png

注意.png

旧版JUnit的使用方法.png

既想使用Junit5也想使用JUnit4需要这么引用依赖.png

JUnit整合Springboot.png

image.png

要使用Springboot容器功能则需要接入该注解.png

重复测试5次.png

单元测试--断言机制

断言机制就是使用条件判断测试方法是否满足条件

断言例子

image.png

image.png

断言机制官方案例

单元测试 - 前置条件(假设)

image.png

image.png

image.png

image.png

image.png

指标监控 SpringBoot Actuator


image.png

image.png

image.png
management:
  endpoints:
    enabled-by-default: true #默认开启所有监控端点
    web:
      exposure:
        include: '*' #以web方式暴露所有端点

指标监控 - 开启与禁用

1.png

2.png

3.png

4.png

5开放三个端点,默认不开启所有端点.png

6.png

jconsole也可开启监控.png

定制-Endpoint

image.png

image.png

image.png

image.png

image.png

image.png

Endponint有教学

指标监控 - 可视化

官方地址:https://github.com/codecentric/spring-boot-admin

相关依赖.png

主程序注解.png

注册客户端

通过配置Spring Boot Admin Server的URL来启用SBA客户端

通过配置Spring Boot Admin Server的URL来启用SBA客户端

spring-boot-starter-security后需要配置放行

因为.png

所以.png

image.png

image.png

高级特性 - Profile环境切换

目录

给配置文件绑定值

分别创建默认配置、生产配置、测试配置,HelloController会默认选中默认配置文件
#通过此配置切换环境
spring.profiles.active=prod
命令行方式激活

修改配置文件任意值,命令行优先

@Profile作用在方法上

@Profile绑定配置文件-条件装配

@Profile作用在条件

绑定配置环境里面的person

@Profile分组

@profile激活某个环境.png

1.先激活myprod组,而myprod有ppd和prod,则这两个配置文件激活

外部化配置

意思:当项目部署时外部有个文件可以修改配置能修改数据库端口之类的配置文件
官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

1.  Default properties (specified by setting `SpringApplication.setDefaultProperties`).

2.  [`@PropertySource`](https://docs.spring.io/spring/docs/5.3.5/javadoc-api/org/springframework/context/annotation/PropertySource.html) annotations on your `@Configuration` classes. Please note that such property sources are not added to the `Environment` until the application context is being refreshed. This is too late to configure certain properties such as `logging.*` and `spring.main.*` which are read before refresh begins.

3.  Config data (such as `application.properties` files)

4.  A `RandomValuePropertySource` that has properties only in `random.*`.

5.  OS environment variables.

6.  Java System properties (`System.getProperties()`).

7.  JNDI attributes from `java:comp/env`.

8.  `ServletContext` init parameters.

9.  `ServletConfig` init parameters.

10.  Properties from `SPRING_APPLICATION_JSON` (inline JSON embedded in an environment variable or system property).

11.  Command line arguments.

12.  `properties` attribute on your tests. Available on [`@SpringBootTest`](https://docs.spring.io/spring-boot/docs/2.4.4/api/org/springframework/boot/test/context/SpringBootTest.html) and the [test annotations for testing a particular slice of your application](https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-testing-spring-boot-applications-testing-autoconfigured-tests).

13.  [`@TestPropertySource`](https://docs.spring.io/spring/docs/5.3.5/javadoc-api/org/springframework/test/context/TestPropertySource.html) annotations on your tests.

14.  [Devtools global settings properties](https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-devtools-globalsettings) in the `$HOME/.config/spring-boot` directory when devtools is active.

image.png
高级特性 - 配置加载优先级
拿到环境变量

获取操作系统信息,可以与@Value注解配合使用

输出的结果

配置文件加载顺序

配置文件加载顺序

引用的外部配置大于内部,修改外部即可生效

若conf中有配置文件会把外部的配置文件覆盖

在Linux系统中若config中的v1配置了配置环境则会覆盖外部配置文件

总结:执行环境优先,外部有限,后面的可以覆盖前面的同名配置项

高级特性 - 自定义starter细节

image.png

image.png

案例

1

2.注解1表示该类作为一个配置加载到容器,注解2当容器中没有HelloService类注入到Bean容器中时候生效,注解3启动属性配置功能

2.1.启动@EnableConfigurationProperties就绑定该路径

3.再将起打包放入本地仓库

4.将其依赖导入pom.xml中

5.

5.1

5.2

6.

7.

原理解析 - SpringApplication创建初始化流程 p85放弃

首要懂得原理,Spring注解看硅谷官方看原理

image.png

image.png

image.png

原理解析 - 自定义事件监听组件

接下来的路

image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,245评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,749评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,960评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,575评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,668评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,670评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,664评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,422评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,864评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,178评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,340评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,015评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,646评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,265评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,494评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,261评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,206评论 2 352

推荐阅读更多精彩内容