浅谈Springboot自动配置

目录

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)注解, 作用:给容器批量导入pom依赖组件

详细来说,@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中编写好所有需要加载的组件,根据实际情况按需加载,即spring.factories中是pom文件的依赖导入项目包外需要注册的bean类名。)

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文件形式),则以用户配置的的为准。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值