spring-3
spring boot
两大核心:
- 自动化配置、简化配置核心-基于Configuration、EnableXXX,Condition
- spring-boot-starter-脚手架核心,整合各种第三方类库、协同工具
约定大于配置
关键在于默认值或者默认的配置方式,可以做到开箱即用。
- maven目录结构:默认使用resources文件夹存放配置文件
- 默认使用application.properties/yaml文件作为配置文件
- 默认通过spring.profiles.active属性来做环境配置的隔离
- EnableAutoConfiguration默认实现starter的自动装载
- spring-boot-start-web 中默认包含 spring-mvc 相关依赖以及内置的 web容器,使得 构建一个 web 应用更加简单。
自动化配置原理
从@SpringBootApplication开始,可以看作以下注解的结合体:
- @EnableAutoConfiguration:启用 SpringBoot 的自动配置机制
- @Configuration:允许在上下文中注册额外的 bean 或导入其他配置类
- @ComponentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。如下图所示,容器中将排除TypeExcludeFilter和AutoConfigurationExcludeFilter。
过程
@EnableAutoConfiguration:实现自动装配的核心注解
EnableAutoConfiguration 只是一个简单地注解,自动装配核心功能的实现实际是通过 AutoConfigurationImportSelector类
AutoConfigurationImportSelector:加载自动装配类
AutoConfigurationImportSelector 类实现了 ImportSelector接口,也就实现了这个接口中的 selectImports方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中。
AutoConfigurationImportSelector中的getAutoConfigurationEntry()方法,这个方法主要负责加载自动配置类的,调用链:
- AutoConfigurationImportSelector.getAutoConfigurationEntry()
- SpringFactoriesLoader.loadFactoryNames()
- SpringFactoriesLoader.loadSpringFactories(ClassLoader classLoader)//从META/spring.factories加载自动配置类
getAutoConfigurationEntry()查找所有Configuration:
- 检查自动装配开关:spring.boot.enableautoconfiguration=true
- 获取EnableAutoConfiguration注解中的 exclude 和 excludeName
- 读取META-INF/spring.factories,获取需要自动装配的所有配置类
- 根据条件注解,筛选最终需要加载的Configuration
Spring Boot 提供的条件注解:
- @ConditionalOnBean:当容器里有指定 Bean 的条件下
- @ConditionalOnMissingBean:当容器里没有指定 Bean 的情况下
- @ConditionalOnClass:当类路径下有指定类的条件下
- @ConditionalOnMissingClass:当类路径下没有指定类的条件下
- @ConditionalOnProperty:指定的属性是否有指定的值
- @ConditionalOnResource:类路径是否有指定的值
- @ConditionalOnExpression:基于 SpEL 表达式作为判断条件
- @ConditionalOnSingleCandidate:当指定 Bean 在容器中只有一个,或者虽然有多个但是指定首选 Bean
- @ConditionalOnJava:基于 Java 版本作为判断条件
- @ConditionalOnJndi:在 JNDI 存在的条件下差在指定的位置
- @ConditionalOnNotWebApplication:当前项目不是 Web 项目的条件下
- @ConditionalOnWebApplication:当前项目是 Web 项 目的条件下
网友评论