自动配置原理

SpringBoot在启动时 会加载主配置类 通过注解开启自动配置功能@EnableAutoConfiguration

该注解的作用:利用选择器来为Spring容器导入一些组件
其底层有一个方法:

List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

翻译过来 也就是获取候选配置

它会扫描所有jar包类路径下的META-INF/spring.factories文件
然后将扫描到的这些文件的内容包装成Properties对象 再从Properties对象中获取EnableAutoConfiguration.class类对应的值 最后将它们添加到容器中

将类路径下的META-INF的spring.factories文件中配置的所有EnableAutoConfiguration的值加入到容器中

篇幅限制 仅列举一部分自动配置类:

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.cloud.CloudAutoConfiguration,\
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration,\
org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
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.gson.GsonAutoConfiguration,\
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration,\
org.springframework.boot.autoconfigure.security.SecurityFilterAutoConfiguration,\
org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration,\
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration

(上面每一个类都是以AutoConfiguration结尾 因而就用xxxAutoConfiguration统称)

每一个xxxAutoConfiguration自动配置类 都是容器中的一个组件
用这些自动配置类来进行自动配置

每一个自动配置类都会进行自动配置功能
所有配置文件中能配置的属性都在对应的xxxProperties类中封装着
因而 欲知道配置文件能配置什么属性 参考对应的属性类即可 非常方便

SpringBoot的底层会根据当前不同的条件进行判断 以决定该配置类是否生效
一旦生效 则该配置类就会给容器中添加各种组件 这些组件的属性都是从对应的xxxProperties类中获取的 而xxxProperties类中的每个属性都是和配置文件一一绑定

  • xxxAutoConfiguration自动配置类 用于给容器中添加组件
  • xxxProperties:用于封装配置文件中的相关属性

因此:

SpringBoot启动时加载大量的自动配置类
只需要看需要的功能是否有SpringBoot默认写好了的配置类

  • 看自动配置类共配置了哪些组件 若已经有了需要使用的组件 则无须再配置
  • 没有 则需要自己写一个配置类 从而配置相应的组件

当给容器中的自动配置类添加组件的时候 会从Properties类中获取某些属性 因而 可以在配置文件指定这些属性的值


自动配置类必须在一定条件下才能生效
@Conditionalxxx注解能帮助判断附带的条件是否生效

如何详细知道哪些自动配置类能生效?
通过配置中的debug=true来启用该模式 开启自动配置报告
可以很方便地知道哪些自动配置类能生效 哪些没有启用及原因
结果会打印在控制台上


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐