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

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