SpringBoot 自动配置主要经过
@EnableAutoConfiguration
,@Conditional
,@EnableConfigurationProperties
或者@ConfigurationProperties
等几个注解来进行自动配置完成的。
@EnableAutoConfiguration
开启自动配置,主要做用就是调用Spring-Core
包里的loadFactoryNames()
,将autoconfig
包里的已经写好的自动配置加载进来。
@Conditional
条件注解,经过判断类路径下有没有相应配置的jar
包来肯定是否加载和自动配置这个类。
@EnableConfigurationProperties
的做用就是,给自动配置提供具体的配置参数,只须要写在application.properties
中,就能够经过映射写入配置类的POJO
属性中。java
@Enable*注释并非SpringBoot
新发明的注释,Spring 3框架就引入了这些注释,用这些注释替代XML配置文件。好比:
@EnableTransactionManagement
注释,它可以声明事务管理
@EnableWebMvc
注释,它能启用Spring MVC
@EnableScheduling
注释,它能够初始化一个调度器。web
@Import
注释导入。EnableAutoConfigurationImportSelector
,AutoConfigurationImportSelector
selectImports()
方法,他调用了getCandidateConfigurations()
方法,在这里,这个方法又调用了Spring Core包中的loadFactoryNames()
方法。这个方法的做用是,会查询META-INF/spring.factories
文件中包含的JAR
文件。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,\
这个类进行了简单的Spring配置,声明了Redis所需典型Bean,和其它不少类同样,重度依赖于Spring Boot注释:
1)@ConditionOnClass激活一个配置,当类路径中存在这个类时才会配置该类
2)@EnableConfigurationProperties自动映射一个POJO到Spring Boot配置文件(默认是application.properties文件)的属性集。
3)@ConditionalOnMissingBean启用一个Bean定义,但必须是这个Bean以前未定义过才有效。
还可使用@ AutoConfigureBefore注释、@AutoConfigureAfter注释来定义这些配置类的载入顺序。redis
此注释使得只有在特定条件知足时才启用一些配置。SrpingBoot的AutoConfig大量使用了@Conditional,它会根据运行环境来动态注入Bean。这里介绍一些@Conditional的使用和原理,并自定义@Conditional来自定义功能。spring
仅仅在当前上下文中存在某个对象时,才会实例化一个Beanexpress
某个class位于类路径上,才会实例化一个Bean),该注解的参数对应的类必须存在,不然不解析该注解修饰的配置类springboot
当表达式为true的时候,才会实例化一个Bean微信
仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean,该注解表示,若是存在它修饰的类的bean,则不须要再建立这个bean,能够给该注解传入参数例如@ConditionOnMissingBean(name = "example"),这个表示若是name为“example”的bean存在,这该注解修饰的代码块不执行app
某个class类路径上不存在的时候,才会实例化一个Bean框架
不是web应用时,才会执行webapp
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "may")
在须要注入配置的类上加上这个注解,prefix的意思是,以该前缀打头的配置,如下是例子
@ConfigurationProperties(prefix = "may") public class User { private String name; private String gender; //省略setter,getter方法 }
application.yml中的配置
may name: youjie gender: man
若是不用系统初始的application.yml配置类,而是使用本身的如youjie.yml,能够以下配置
@ConfigurationProperties(prefix = "may",locations = "classpath:youjie.yml") public class User2 { private String name; private String gender; //省略setter,getter方法 }
过期:因为Spring-boot 1.5.2版本移除了,locations这个属性,所以上述这种方式在最新的版本中过期。
@PropertySource
Spring-boot 1.5.2版本以后,采用下面这种方式
@Component //@PropertySource只能加载.properties文件,须要将上面的yml文件,改成.properties文件 @PropertySource("classpath:may.properties") @ConfigurationProperties(prefix="may") public class User2 { private String name; private String gender; //省略setter,getter方法 }
@EnableConfigurationProperties
最后注意在spring Boot入口类加上@EnableConfigurationProperties
@SpringBootApplication @EnableConfigurationProperties({User.class,User2.class}) public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
其实这里@EnableConfigurationProperties({User.class,User2.class}) 能够省略
SpringBoot 的 自动配置得益于 SpringFramework 强大的支撑,框架早已有不少工具和注解能够自动装配 Bean 。SpringBoot 经过 一个封装,将市面上通用的组件直接写好了配置类。当咱们程序去依赖了这些组件的 jar 包后,启动 SpringBoot应用,因而自动加载开始了。
咱们也能够定义本身的自动装配组件,依赖以后,Spring直接能够加载咱们定义的 starter 。笔者将在后续文章中进行编码和解读。