灵魂挖掘SpringBoot设计哲学

212 阅读6分钟

博主是Java交流君羊:723749901

学完课程你会收获什么?

  1. 彻底理解SpringBoot自动化配置

  2. 应对企业面试SpringBoot自动化配置热点问题

SpringBoot 设计上的哲学

  • 约定优于配置(注解)
  • 开箱即用(Starter +自动化配置)
  • 独立的web 应用(tomcat|jetty)
  • 独特的Parent 依赖()
  • 生产级别应用监控

SpringBoot 自动化配置是如何实现的?

  1. 认识Starter坐标体系

    Starter 坐标分类(官方 第三方)

    ​ Starter 坐标查找:官方文档,Mvn中央仓库 ,国内Aliyun 仓库服务

    Maven 坐标的传递性依赖(Spring-Context默认自动依赖 Spring-Beans,Spring-Core,Spring-EL,Spring-AOP)

    ​ 统一的版本控制( 标签 指定SpringBoot 版本)

  2. SpringBoot 引入Starter 坐标后,内部的配置类是如何生效的?

​ 2.1. 元注解&组合注解

​ 2.2.条件化注解

​ 2.3.@EnableXXX & @Import

​ 2.4.SpringBoot 加载的配置类在哪里(MATAINFO/spring.factories)

Starter 坐标

Jar演进过程

如何正确理解Starter 坐标?

理解Starter的正确姿势

Starter坐标分类

  • 部分官方Starter坐标

  • 第三方Starter坐标

传递性依赖

统一的版本号

​ 引入的Starter 坐标不用关注其坐标的版本号得益于Parent坐标的依赖,工程中引入标签,通过依赖依赖父工程来达到坐标版本的统一控制

精简的注解-@SpringBootApplication

元注解&组合注解

元注解

​ 元注解由java API提供,用来定义注解的注解

  • @Target

    | 声明级别 | 描述 | | :-------------------------: | :--------------------------------: | | ElemenetType.CONSTRUCTOR | 构造器声明 | | ElemenetType.FIELD | 字段 | | ElemenetType.LOCAL_VARIABLE | 局部变量声明 | | ElemenetType.METHOD | 方法声明 | | ElemenetType.PACKAGE | 包声明 | | ElemenetType.PARAMETER | 参数声明 | | ElemenetType.TYPE | 类,接口(包括注解类型)或enum声明 |

  • @Retention

    | 级别 | 描述 | | :-------------------------: | :----------------------------------------------------------: | | RetentionPolicy.SOURCE | 注解将被编译器丢弃 | | RetentionPolicy.CLASS | 注解在class文件中可用,但会被VM丢弃 | | RetentionPolicy.RUNTIME | VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。 |

  • @Documented

​ javac 生成文档保留

  • @Inherited

    ​ 注解是否允许继承

组合注解

​ 由多个注解注解的注解,多个注解组合到一起定义一个新的注解。Spring ,SpringBoot这块有大量组合注解

条件化注解

​ 条件注解就是可以根据不同的条件来做出不同的事情。SpringBoot为了满足不同条件下配置类生效,采用条件注解方式来动态控制配置类生效方式。

部分条件话注解列表:

注解功能
@ConditionalOnBean配置某个特定Bean
@ConditionalOnClassclasspath下存在指定类
@ConditionalOnMissingClassclasspath下缺少指定类
@ConditionalOnMissingBean没有配置特定Bean
@ConditionalOnProperty指定的配置属性要有明确值
@ConditionalOnWebApplicationWeb程序
@ConditionalOnNotWebApplication非Web程序

以RedisAutoConfiguration、JdbcTemplateAutoConfiguration为例

自动化开启@EnableXXX与@Import

@EnableXxx

​ 顾名思义,开启xxx功能,SpringBoot中大量采用该注解来自动化开启某一项环境配置,通常@EnableXxx 注组合@Import 注解来实现某个配置功能的自动开启,看几个栗子

@import导入

​ 用于导入指定的类,而该被导入的类一般为配置类(import标签类似)。其导入配置类的方式常见的有三种

  • 直接引入配置类

  • 根据条件选择配置类

    ​ @Import 中指定的类一般是以 Selector 结尾, 一般都会实现 ImportSelector 接口, 表示当前类会根据条件选择不同的配置类导入。

  • 动态注册Bean

    ​ 指定的类一般是以 Registrar 结尾,表示在代码运行过程中,其使用到了哪个配置类,则系统会自动导入该配置类。

@SpringBootApplication(组合注解 组合自动化配置、扫描器、配置类)

自动化配置类在哪?

注解定义
AutoConfigurationImportSelector加载配置类

总结

博主是Java交流君羊:723749901

博主是Java交流君羊:723749901

学完课程你会收获什么?

  1. 彻底理解SpringBoot自动化配置

  2. 应对企业面试SpringBoot自动化配置热点问题

SpringBoot 设计上的哲学

  • 约定优于配置(注解)
  • 开箱即用(Starter +自动化配置)
  • 独立的web 应用(tomcat|jetty)
  • 独特的Parent 依赖()
  • 生产级别应用监控

SpringBoot 自动化配置是如何实现的?

  1. 认识Starter坐标体系

    Starter 坐标分类(官方 第三方)

    ​ Starter 坐标查找:官方文档,Mvn中央仓库 ,国内Aliyun 仓库服务

    Maven 坐标的传递性依赖(Spring-Context默认自动依赖 Spring-Beans,Spring-Core,Spring-EL,Spring-AOP)

    ​ 统一的版本控制( 标签 指定SpringBoot 版本)

  2. SpringBoot 引入Starter 坐标后,内部的配置类是如何生效的?

​ 2.1. 元注解&组合注解

​ 2.2.条件化注解

​ 2.3.@EnableXXX & @Import

​ 2.4.SpringBoot 加载的配置类在哪里(MATAINFO/spring.factories)

Starter 坐标

Jar演进过程

如何正确理解Starter 坐标?

理解Starter的正确姿势

Starter坐标分类

  • 部分官方Starter坐标

  • 第三方Starter坐标

传递性依赖

统一的版本号

​ 引入的Starter 坐标不用关注其坐标的版本号得益于Parent坐标的依赖,工程中引入标签,通过依赖依赖父工程来达到坐标版本的统一控制

精简的注解-@SpringBootApplication

元注解&组合注解

元注解

​ 元注解由java API提供,用来定义注解的注解

  • @Target

    | 声明级别 | 描述 | | :-------------------------: | :--------------------------------: | | ElemenetType.CONSTRUCTOR | 构造器声明 | | ElemenetType.FIELD | 字段 | | ElemenetType.LOCAL_VARIABLE | 局部变量声明 | | ElemenetType.METHOD | 方法声明 | | ElemenetType.PACKAGE | 包声明 | | ElemenetType.PARAMETER | 参数声明 | | ElemenetType.TYPE | 类,接口(包括注解类型)或enum声明 |

  • @Retention

    | 级别 | 描述 | | :-------------------------: | :----------------------------------------------------------: | | RetentionPolicy.SOURCE | 注解将被编译器丢弃 | | RetentionPolicy.CLASS | 注解在class文件中可用,但会被VM丢弃 | | RetentionPolicy.RUNTIME | VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。 |

  • @Documented

​ javac 生成文档保留

  • @Inherited

    ​ 注解是否允许继承

组合注解

​ 由多个注解注解的注解,多个注解组合到一起定义一个新的注解。Spring ,SpringBoot这块有大量组合注解

条件化注解

​ 条件注解就是可以根据不同的条件来做出不同的事情。SpringBoot为了满足不同条件下配置类生效,采用条件注解方式来动态控制配置类生效方式。

部分条件话注解列表:

注解功能
@ConditionalOnBean配置某个特定Bean
@ConditionalOnClassclasspath下存在指定类
@ConditionalOnMissingClassclasspath下缺少指定类
@ConditionalOnMissingBean没有配置特定Bean
@ConditionalOnProperty指定的配置属性要有明确值
@ConditionalOnWebApplicationWeb程序
@ConditionalOnNotWebApplication非Web程序

以RedisAutoConfiguration、JdbcTemplateAutoConfiguration为例

自动化开启@EnableXXX与@Import

@EnableXxx

​ 顾名思义,开启xxx功能,SpringBoot中大量采用该注解来自动化开启某一项环境配置,通常@EnableXxx 注组合@Import 注解来实现某个配置功能的自动开启,看几个栗子

@import导入

​ 用于导入指定的类,而该被导入的类一般为配置类(import标签类似)。其导入配置类的方式常见的有三种

  • 直接引入配置类

  • 根据条件选择配置类

    ​ @Import 中指定的类一般是以 Selector 结尾, 一般都会实现 ImportSelector 接口, 表示当前类会根据条件选择不同的配置类导入。

  • 动态注册Bean

    ​ 指定的类一般是以 Registrar 结尾,表示在代码运行过程中,其使用到了哪个配置类,则系统会自动导入该配置类。

@SpringBootApplication(组合注解 组合自动化配置、扫描器、配置类)

自动化配置类在哪?

注解定义
AutoConfigurationImportSelector加载配置类

总结

博主是Java交流君羊:723749901