面试必问SpringBoot的自动配置原理

水深无声 2022-12-10 01:15 314阅读 0赞
  1. 大家都知道SpringBoot的简单,简化了大量的配置,简直是我们java开发人员的福音,我们创建完项目,直接就可以运行该项目,不需要任何的配置,不像我们的SSM项目,需要配置两个配置文件(一般是spring.xmlspringmvc.xml),而且文件里也配置了很多的配置,使用起来及其的麻烦,而SpringBoot我们在平时使用的时候,也就只需要配置application.yml文件或者application.properties文件来自定义一些配置。但是也可以不配置就可以使用,大家知道这是为什么吗?这里就是大家还经常将约定大于配置,那你知道具体是什么意思吗?Spring Boot是如何做到约定大于配置的呢?这里就用到了SpringBoot的自动配置原理,在没有自己指定配置的时候使用默认配置的原理! 通过这篇文章大家就会有一定的了解!

在我们创建完SpringBoot项目之后,有一个主启动类,上边添加了@SpringBootApplication这个注解。如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70

进入SpringBootApplication注解可以看到一个@EnableAutoConfiguration注解,这个注解的作用就是开启自动配置。如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70 1

进入这个类可以看到通过@Import注解导入了@Import注解注入了EnableAutoConfigurationImportSelector类,这个选择器用来导入一些组件。如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70 2

进入AutoConfigurationImportSelector里有一个selectImports方法,该方法中调用了getAutoConfigurationEntry方法,如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70 3

getAutoConfigurationEntry方法中有一个configurations,这个configurations会被返回,在方法里调用getCandidateConfigurations方法,如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70 4

getCandidateConfigurations方法返回的就是之前的configurations,而这个方法里又调用了SpringFactoriesLoader下的loadFactoryNames方法,如下图:

20200923103811426.png

loadFactoryNames方法会扫描META-INF/spring.factories文件。如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70 5

那我们就找找spring.factories这个文件,看看里面的具体的配置,先找到External Libraries,如下图:

20200923104854175.png

然后找到org.springframework.boot:spring-boot-autoconfigure的包,打开就可以看到spring.factories的文件。如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70 6

那我就把该文件中的全部配置贴出来,大家可以看看,如下图:

  1. # Initializers
  2. org.springframework.context.ApplicationContextInitializer=\
  3. org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
  4. org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener
  5. # Application Listeners
  6. org.springframework.context.ApplicationListener=\
  7. org.springframework.boot.autoconfigure.BackgroundPreinitializer
  8. # Auto Configuration Import Listeners
  9. org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
  10. org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener
  11. # Auto Configuration Import Filters
  12. org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
  13. org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
  14. org.springframework.boot.autoconfigure.condition.OnClassCondition,\
  15. org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition
  16. # Auto Configure
  17. org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  18. org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
  19. org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
  20. org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
  21. org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
  22. org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
  23. org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\
  24. org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\
  25. org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
  26. org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\
  27. org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\
  28. org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\
  29. org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\
  30. org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\
  31. org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\
  32. org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\
  33. org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\
  34. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\
  35. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\
  36. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\
  37. org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\
  38. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\
  39. org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
  40. org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
  41. org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
  42. org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\
  43. org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\
  44. org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\
  45. org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\
  46. org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\
  47. org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\
  48. org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\
  49. org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\
  50. org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\
  51. org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
  52. org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\
  53. org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
  54. org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
  55. org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
  56. org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
  57. org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
  58. org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
  59. org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\
  60. org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\
  61. org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
  62. org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
  63. org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
  64. org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\
  65. org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\
  66. org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\
  67. org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\
  68. org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\
  69. org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\
  70. org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\
  71. org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\
  72. org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\
  73. org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\
  74. org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\
  75. org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
  76. org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
  77. org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\
  78. org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\
  79. org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
  80. org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\
  81. org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\
  82. org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\
  83. org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\
  84. org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\
  85. org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\
  86. org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
  87. org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
  88. org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
  89. org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
  90. org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\
  91. org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\
  92. org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
  93. org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\
  94. org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\
  95. org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\
  96. org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\
  97. org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\
  98. org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\
  99. org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
  100. org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\
  101. org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\
  102. org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\
  103. org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\
  104. org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\
  105. org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\
  106. org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\
  107. org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\
  108. org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\
  109. org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\
  110. org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\
  111. org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\
  112. org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\
  113. org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\
  114. org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\
  115. org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\
  116. org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\
  117. org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\
  118. org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\
  119. org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\
  120. org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\
  121. org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\
  122. org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\
  123. org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
  124. org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\
  125. org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\
  126. org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\
  127. org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\
  128. org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\
  129. org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\
  130. org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\
  131. org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\
  132. org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\
  133. org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\
  134. org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\
  135. org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\
  136. org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\
  137. org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\
  138. org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\
  139. org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
  140. org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\
  141. org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\
  142. org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\
  143. org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\
  144. org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration
  145. # Failure analyzers
  146. org.springframework.boot.diagnostics.FailureAnalyzer=\
  147. org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
  148. org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
  149. org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
  150. org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
  151. org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\
  152. org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\
  153. org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer
  154. # Template availability providers
  155. org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
  156. org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
  157. org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
  158. org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
  159. org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
  160. org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider

可以看到该文件可以看到很多的自动配置类,springboot自动配置的核心就是这些自动配置类。在@SpringBootApplicaton注解中@ComponentScan注解将扫描和加载一些自定义的类,@EnableAutoConfiguration将导入一些自动配置的类。这些自动配置的类很多,并且他们都处于org.springframework.boot.autoconfigure这个包下面。这些配置类都会被导入并处于备用状态。这里的每一个AutoConfiguration.**类都是容器中的一个组件,并且都会加入到容器中,在这些自动配置类加入到容器之后自动配置才开始生效。假如你在maven文件当中引入了相关的包的时候,相关功能将被启用。如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70 7

spring.factories的文件的都一一对应org.springframework.boot.autoconfigure这个包下的自动配置类,以AOP为例,如下图:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zODAwNzE4NQ_size_16_color_FFFFFF_t_70 8

SpringBoot的自动配置原理就学习完啦,欢迎点赞、关注、谢谢。

发表评论

表情:
评论列表 (有 0 条评论,314人围观)

还没有评论,来说两句吧...

相关阅读