目录
1.自动配置原理
2.自动配置案例
3.总结
1.自动配置原理
在一个Springboot程序中,我们只需要在main程序中使用@springBootApplication注解即可标记为一个一个Springboot程序,然后使用
SpringApplication.run(TestMain.class,args)
代码即可创建IOC容器运行Springboot程序。
在@springBootApplication注解中,查看源码可得知,其可以划分为以下三个主要注解:
-
@SpringBootConfiguration 注解,代表spring相关配置类
-
@EnableAutoConfiguration 注解
-
@ComponentScan 注解,指定扫描的包
其中@EnableAutoConfiguration 注解为springboot自动配置核心注解。
其可以进一步划分为:
- @AutoConfigurationPackage注解, 作用:main程序所在包下组件全部注册
- @Import(AutoConfigurationImportSelector.class)注解, 作用:给容器批量导入组件
详细来说,@AutoConfigurationPackage注解给容器中导入AutoConfigurationPackages.Register. class包,该包中的registerBeanDefinitions方法给容器批量注册容器:
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImport(metadata));
}
}
上述代码中的参数BeanDefinitionRegistry(BeanDefinition中存放spring注册的所有bean)可以获得所有注册的bean。所以最终可以获得所有main包下注册的bean的名字,进行注册。
而AutoConfigurationImportSelector.class中会使用一个SpringFactoriesLoader,通过资源文件的方式,加载所有的组件:
(spring.factories中编写好所有需要加载的组件,根据实际情况按需加载)
2.自动配置案例
首先,我们从cache组件中查看自动配置案例。
打开spring.autoConfiguration相关依赖,点开cache组件,我们可以查得自动配置的相关代码:
有上述代码可以得知,cache为条件装配。
以 @ConditionalOnClass(CacheManager.class)为例,当程序中没有CacheManager这个类时,不会自动配置这个组件,而CacheManager类springboot中是没有的,只有当注入相关依赖后,才会存在:
<!-- spring cache 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
所以,只有当包含spring cache 相关依赖后,springboot发现符合条件,才会自动进行装配。
@ConditionalOnMissingBean(value = CacheManager.class, name = "cacheResolver")则是当用户引入了相关依赖,但自定义了bean不是规范的名称时,会自动进行装配。所以,用户可以通过规范名称自定义bean的方式来装配组件。
@EnableConfigurationProperties(CacheProperties.class)则是根据用户Properties配置文件中的填写属性,对CacheProperties这个类中的属性进行覆盖,来对组件中的值进行自动配置;若没有填写,则为默认值:
application.properties文件中相关属性编写,对类中属性进行覆盖:
spring.cache.type=redis
spring.cache.redis.time-to-live= 60000
spring.cache.redis.cache-null-values=true
3.总结
springboot程序启动时,会根据注解先加载所有的xxxAutoConfiguration,根据其condition条件,进行按需装配,组件存在,即可使用其相关的功能,用户如果配置了,则用户优先。
简单来说就是,Springboot会默认在底层配好所有的组件,进行条件装配;如果用户自定义了相关配置(bean或是properties文件形式),则以用户配置的的为准。