SpringBoot 自动配置主要通过
@EnableAutoConfiguration
,@Conditional
,@EnableConfigurationProperties
或者@ConfigurationProperties
等几个注解来进行自动配置完成的。
@EnableAutoConfiguration
开启自动配置,主要作用就是调用Spring-Core
包里的loadFactoryNames()
,将autoconfig
包里的已经写好的自动配置加载进来。
@Conditional
条件注解,通过判断类路径下有没有相应配置的jar
包来确定是否加载和自动配置这个类。
@EnableConfigurationProperties
的作用就是,给自动配置提供具体的配置参数,只需要写在application.properties
中,就可以通过映射写入配置类的POJO
属性中。
@EnableAutoConfiguration
@Enable*注释并不是SpringBoot
新发明的注释,Spring 3框架就引入了这些注释,用这些注释替代XML配置文件。比如:
@EnableTransactionManagement
注释,它能够声明事务管理
@EnableWebMvc
注释,它能启用Spring MVC
@EnableScheduling
注释,它可以初始化一个调度器。
这些注释事实上都是简单的配置,通过@Import
注释导入。
从启动类的@SpringBootApplication进入,在里面找到了@EnableAutoConfiguration,
@EnableAutoConfiguration里通过@Import导入了EnableAutoConfigurationImportSelector
,
进入他的父类AutoConfigurationImportSelector
找到selectImports()
方法,他调用了getCandidateConfigurations()
方法,在这里,这个方法又调用了Spring Core包中的loadFactoryNames()
方法。这个方法的作用是,会查询META-INF/spring.factories
文件中包含的JAR
文件。
当找到spring.factories文件后,SpringFactoriesLoader将查询配置文件命名的属性。
Jar
文件在org.springframework.boot.autoconfigure的spring.factories
spring.factories
内容如下(截取部分),在这个文件中,可以看到一系列Spring Boot自动配置的列表
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\