SpringBoot从入门到放弃,原理篇自动配置原理

编程

SpringBoot从入门到放弃,原理篇-自动配置原理

springboot自动配置原理

配置文件能配置的属性参照

自动配置原理

1、springboot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

2、@EnableAutoConfiguration 作用:

  • 利用EnableAutoConfigurationImportSelector给容器中导入一些组件

  • 可以查看seletcImports方法的内容

  • List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); 获取候选的配置

SpringFactoriesLoader.loadFactoryNames()

扫描所有jar包类路径下 META-INF/springboot.factories

把扫描到的这些文件袋额内容包装成properties对象。

从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加到容器中

将类路径下 META-INF/spring.factories里边配置的所有EnableAutoConfigration的值加入到了容器中; (spring-boot-autoconfigure:2.2.1.RELEASE包中)

# Auto Configure

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.CloudServiceConnectorsAutoConfiguration,

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.CassandraReactiveDataAutoConfiguration,

org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,

org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,

org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,

org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,

org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,

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.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,

org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveRestClientAutoConfiguration,

org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,

org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,

org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,

org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,

org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,

org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,

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.RedisReactiveAutoConfiguration,

org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,

org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,

org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,

org.springframework.boot.autoconfigure.elasticsearch.jest.JestAutoConfiguration,

org.springframework.boot.autoconfigure.elasticsearch.rest.RestClientAutoConfiguration,

org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,

org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,

org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,

org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,

org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,

org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,

org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,

org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,

org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,

org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,

org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,

org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,

org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,

org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,

org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,

org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,

org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,

org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,

org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,

org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,

org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,

org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,

org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,

org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,

org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,

org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,

org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,

org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,

org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,

org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,

org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,

org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,

org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,

org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,

org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,

org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,

org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,

org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,

org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,

org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,

org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,

org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,

org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,

org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,

org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,

org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,

org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,

org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,

org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,

org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,

org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,

org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,

org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,

org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,

org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,

org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,

org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,

org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,

org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,

org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,

org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,

org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,

org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,

org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,

org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,

org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,

org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,

org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,

org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,

org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,

org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,

org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,

org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,

org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,

org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,

org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,

org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,

org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,

org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,

org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,

org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration

每一个这样的XXXAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置。

3、每一个自动配置类,进行自动配置功能

4、以HttpEncodingAutoConfiguration(HTTP编码自动配置)为例解释自动配置原理

//这是一个配置类

@Configuration(proxyBeanMethods = false)

//启用configurationProperties功能,将配置文件中对应的值和HttpProperties下的Encoding绑定起来,并把HttpProperties.Encoding加入到IOC容器中

@EnableConfigurationProperties(HttpProperties.class)

//spring底层@Conditional注解,根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置

//就会生效;

//判断当前应用是否是web应用,如果是,当前配置类生效

@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)

//判断当前项目有没有CharacterEncodingFilter类

//CharacterEncodingFilter是springmvc中进行乱码解决的过滤器

@ConditionalOnClass(CharacterEncodingFilter.class)

//判断配置文件中是否存在某个配置 spring.http.encoding.enabled

//matchIfMissing表示即使spring.http.encoding.enabled不存在,也是生效的

@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)

public class HttpEncodingAutoConfiguration {

//它已经和springboot的配置文件映射了

private final HttpProperties.Encoding properties;

//只有一个有参构造器的情况下,参数的值就会从容器中拿

public HttpEncodingAutoConfiguration(HttpProperties properties) {

this.properties = properties.getEncoding();

}

//给容器中添加一个组件,这个组件的某些之需要从properties中获取

@Bean

@ConditionalOnMissingBean

public CharacterEncodingFilter characterEncodingFilter() {

CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();

filter.setEncoding(this.properties.getCharset().name());

filter.setForceRequestEncoding(this.properties.shouldForce(Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(Type.RESPONSE));

return filter;

}

}

根据当前不同的条件判断,决定这个配置类是否生效

一旦这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties中获取的,这些类里面的每一个属性又是和配置文件绑定的

5、所有在配置文件中能配置的属性都是在XXXProperties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类

//从配置文件中获取指定的值和bean的属性进行绑定

@ConfigurationProperties(prefix = "spring.http")

public class HttpProperties {

private boolean logRequestDetails;

private final Encoding encoding = new Encoding();

public static class Encoding {

public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

private Charset charset = DEFAULT_CHARSET;

private Boolean force;//属性

private Boolean forceRequest;//属性

private Boolean forceResponse;//属性

private Map<Locale, Charset> mapping;//属性

}

}

精髓

1)、SpringBoot启动会加载大量的自动配置类;

2)、看我们需要的功能有没有SpringBoot默认写好的自动配置类;

3)、我们再来看这个自动配置类中到底配置了那些组件;(只要我们要用的组件有,我们就不需要再来配置了)

4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值;

XXXAutoConfiguration:自动配置类;给容器添加组件

XXXProperties:封装配置文件中相关的属性

关于conditional按条件注册Bean,已经在以前的Spring注解开发教程中写过了

以上是 SpringBoot从入门到放弃,原理篇自动配置原理 的全部内容, 来源链接: utcz.com/z/510848.html

回到顶部