@EnableAutoConfiguration注解

在刚刚学习springboot的过程中,根据springboot1.5版本和2.0及以上版本对比的时候,出现了@EnableAutoConfiguration这一注解的问题。
首先是1.5版本中,我首先使用的是Spring Tool Suite4的开发工具
@EnableAutoConfiguration注解_第1张图片
然后是springboot2.0及以上版本,我使用的则是Intellij IDEA 2017版本的,在这个版本中如果使用1.5版本的代码写法的话是会报错的。如图:
@EnableAutoConfiguration注解_第2张图片
必须在2.0及以上版本中加上@EnableAutoConfiguration注解,就可以解决这一问题。先来看看@EnableAutoConfiguration注解的源码
@EnableAutoConfiguration注解_第3张图片
可以看出@EnableAutoConfiguration这一注解其实是包含了许多注解,其中@Import(AutoConfigurationImportSelector.class)注解就是配合Configuration来使用,用来导出更多的Configuration类,AutoConfigurationImportSelector实现DeferredImportSelector接口,DeferredImportSelector接口继承ImportSelector接口
@EnableAutoConfiguration注解_第4张图片
导出的类是通过SpringFactoriesLoader.loadFactoryNames()读取了ClassPath下面的META-INF/spring.factories文件。
简而言之就是@EnableAutoConfiguration注解可以帮springboot把所有符合条件的配置都加载到当前springboot创建并使用的IOC容器,其中springboot的原有的一个工具类springFactoriesLoader就发挥了很大的作用。

关于SpringFactoriesLoader:
SpringFactoriesLoader属于Spring框架私有的一种扩展方案(类似于Java的SPI方案java.util.ServiceLoader),其主要功能就是从指定的配置文件META-INF/spring.factories加载配置,spring.factories是一个典型的java properties文件,配置的格式为Key = Value形式,只不过Key和Value都是Java类型的完整类名(Fully qualified name)

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdmin- JmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.PropertyPlaceholderAuto- Configuration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAuto-Configuration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationProperties-AutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceException-TranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.Cassandra-DataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.Cassandra-RepositoriesAutoConfiguration,\

以上是从SpringBoot的autoconfigure依赖包中的META-INF/spring.factories配置文件中摘录的一段内容,可以很好地说明问题。
归根结底,@EnableAutoConfiguration自动配置的原理就是:从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中的org.spring-framework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过反射实例化为对应的标注了@Configuration的javaConfig形式的IOC容器配置类,然后汇总为一整个并加载到IOC容器。

你可能感兴趣的:(Springboot)