内容简介:在Spring Boot中自动配置一般使用所谓的自动配置就是执行具体的这个简单的自动配置也说明了
在Spring Boot中自动配置一般使用 @EnableXXX
方式,Spring默认提供了 @EnableAutoConfiguration
来配置starter,另外还提供了类似 @EnableScheduling
来配置非starter的相关bean,从源码角度来看,两种方式本质上来说并没什么区别,其都使用了 @Import
来导入一个对应的配置入口类,然后正在启动中的Spring IoC容器会尝试初始化该类,那么该配置入口类相当于拿到了 ApplicationContext
,自然可以做很多的自由发挥。
清单1:EnableAutoConfiguration源码
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(EnableAutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; // ....... }
清单2:EnableScheduling源码
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(SchedulingConfiguration.class) @Documented public @interface EnableScheduling { }
如何自动配置
所谓的自动配置就是执行具体的 Configuration
类,首先先看比较简单的 @EnableScheduling
注解,该注解对应的配置类为 SchedulingConfiguration
,在 SchedulingConfiguration
中往IOC中注入了一个 DestructionAwareBeanPostProcessor
处理器,用于扫描定时器方法,然后初始化整个定时器调度。
这个简单的自动配置也说明了 @EnableXXX
本质上是一个开关,告诉Spring该去配置哪些东西,该怎么配置这些东西。
清单3:EnableScheduling对应的SchedulingConfiguration配置
@Configuration @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public class SchedulingConfiguration { @Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() { return new ScheduledAnnotationBeanPostProcessor(); } }
那么对于starter模块是如何做到自动配置的呢?答案是 @EnableAutoConfiguration
,该注解对应的配置类为 EnableAutoConfigurationImportSelector
,该类实现了 ImportSelector
接口,在Spring Boot的Application Context启动时会主动调用其 org.springframework.context.annotation.ImportSelector#selectImports
方法,那么自动注入的核心就在该方法中。
在 EnableAutoConfigurationImportSelector
在启动后回去扫描 META-INF/spring.factories
文件,该文件是Spring Boot提供的Starter自我配置的入口,以mybatis starter为例,其形式如下:
清单4: mybatis starter配置
# Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
其目地告诉Spring Boot使用 org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration
来配置我这个模块,Spring Boot获取到该配置后会经过一系列的判断(比如是否被用户手动exclude),然后决定加载后将该类纳入Spring Boot的配置中去,让IoC容器去完成配置。到此整个自动配置发现流程就算完成,这种方式类似 Java 提供的SPI,利用classpath下的配置信息达到批量自动配置的目地。
如何利用自动配置
自动配置的原理是很简单的,总结起来就两种,如果你想要让用户主动配置,那么可以提供一个自定义的 EnableXXX
注解,在该注解中import对应的配置类,如果你想让Spring Boot再启动的时候自动配置,那么在 META-INF
下提供对应的spring.factories文件,让Spring自动加载对应的配置类。
Spring Boot利用这种做法能让模块与模块之间解耦,所有的模块之间通过IoC容器进行联系,那么对写代码就很有启发了,比如在项目中要对接多个短信服务商,那么每一个短信服务商实际上就是一个Plugin,那么给每一个服务商写一个 EnableXXX
注解,让Spring自动配置到IoC容器中,使用方也只需要从IoC中获取,也是一种不错的解耦的设计。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- SpringBoot自动配置原理
- Nacos配置中心原理
- Haproxy原理与配置讲解
- mybatis原理,配置介绍及源码分析
- SpringBoot系列二:SpringBoot自动配置原理
- MySQL半同步复制的搭建和配置原理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Django 1.0 Template Development
Scott Newman / Packt / 2008 / 24.99
Django is a high-level Python web application framework designed to support the rapid development of dynamic websites, web applications, and web services. Getting the most out of its template system a......一起来看看 《Django 1.0 Template Development》 这本书的介绍吧!
JS 压缩/解压工具
在线压缩/解压 JS 代码
URL 编码/解码
URL 编码/解码