spring-3

作者: 甜甜起司猫_ | 来源:发表于2021-08-11 09:14 被阅读0次

spring-3

spring boot

两大核心:

  1. 自动化配置、简化配置核心-基于Configuration、EnableXXX,Condition
  2. spring-boot-starter-脚手架核心,整合各种第三方类库、协同工具

约定大于配置

关键在于默认值或者默认的配置方式,可以做到开箱即用。

  1. maven目录结构:默认使用resources文件夹存放配置文件
  2. 默认使用application.properties/yaml文件作为配置文件
  3. 默认通过spring.profiles.active属性来做环境配置的隔离
  4. EnableAutoConfiguration默认实现starter的自动装载
  5. spring-boot-start-web 中默认包含 spring-mvc 相关依赖以及内置的 web容器,使得 构建一个 web 应用更加简单。

自动化配置原理

从@SpringBootApplication开始,可以看作以下注解的结合体:

  1. @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
  2. @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
  3. @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。如下图所示,容器中将排除TypeExcludeFilter和AutoConfigurationExcludeFilter。

过程

@EnableAutoConfiguration:实现自动装配的核心注解

EnableAutoConfiguration 只是一个简单地注解,自动装配核心功能的实现实际是通过 AutoConfigurationImportSelector类

AutoConfigurationImportSelector:加载自动装配类

AutoConfigurationImportSelector 类实现了 ImportSelector接口,也就实现了这个接口中的 selectImports方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中。

AutoConfigurationImportSelector中的getAutoConfigurationEntry()方法,这个方法主要负责加载自动配置类的,调用链:

  1. AutoConfigurationImportSelector.getAutoConfigurationEntry()
  2. SpringFactoriesLoader.loadFactoryNames()
  3. SpringFactoriesLoader.loadSpringFactories(ClassLoader classLoader)//从META/spring.factories加载自动配置类

getAutoConfigurationEntry()查找所有Configuration:

  1. 检查自动装配开关:spring.boot.enableautoconfiguration=true
  2. 获取EnableAutoConfiguration注解中的 exclude 和 excludeName
  3. 读取META-INF/spring.factories,获取需要自动装配的所有配置类
  4. 根据条件注解,筛选最终需要加载的Configuration

Spring Boot 提供的条件注解:

  • @ConditionalOnBean:当容器里有指定 Bean 的条件下
  • @ConditionalOnMissingBean:当容器里没有指定 Bean 的情况下
  • @ConditionalOnClass:当类路径下有指定类的条件下
  • @ConditionalOnMissingClass:当类路径下没有指定类的条件下
  • @ConditionalOnProperty:指定的属性是否有指定的值
  • @ConditionalOnResource:类路径是否有指定的值
  • @ConditionalOnExpression:基于 SpEL 表达式作为判断条件
  • @ConditionalOnSingleCandidate:当指定 Bean 在容器中只有一个,或者虽然有多个但是指定首选 Bean
  • @ConditionalOnJava:基于 Java 版本作为判断条件
  • @ConditionalOnJndi:在 JNDI 存在的条件下差在指定的位置
  • @ConditionalOnNotWebApplication:当前项目不是 Web 项目的条件下
  • @ConditionalOnWebApplication:当前项目是 Web 项 目的条件下

相关文章

  • spring-3

    spring-3 spring boot 两大核心: 自动化配置、简化配置核心-基于Configuration、E...

网友评论

      本文标题:spring-3

      本文链接:https://www.haomeiwen.com/subject/qkhfbltx.html