プロファイル
自動設定原理分析
マスタ構成クラスローディングは、自動設定がオンするとき1. SpringBootが起動@EnableAutoConfigurationを
2. @EnableAutoConfiguration作用:
- 使用EnableAutoConfigurationImportSelector容器に成分の一部を導入します。
- あなたはこのクラスを表示することができます)(selectImportsのコンテンツの方法を、彼が返さ autoConfigurationEntryをから、this.getAutoConfigurationEntry(autoConfigurationMetadata、annotationMetadata);このメソッド。続行。
- このメソッドは、値があります:リスト<文字列> = this.getCandidateConfigurations設定(annotationMetadata、属性);設定が候補と呼ばれる得る、従うことを継続します。
保護されたリストの<string> getCandidateConfigurations(AnnotationMetadataメタデータ、AnnotationAttributes属性){ リストの<string>構成= SpringFactoriesLoader.loadFactoryNames(この .getSpringFactoriesLoaderFactoryClass()、この.getBeanClassLoader())。 Assert.notEmpty(構成、「ノー自動設定クラスは、META-INF / spring.factoriesで見つかったカスタムパッケージを使用している場合は、ファイルが正しいことを確認してください。。」); 戻り値の設定; }
-
ここにありますSpringFactoriesLoader.loadFactoryNamesが)( 、我々はそれが呼び出され、それに見ていきloadSpringFactories法;に従い続けます。「META-INF / spring.factories」:私はそれがリソースファイルを取得するために見つけます
-
列挙<URL> URLを=クラスローダ!= nullの?classLoader.getResources( "META-INF / spring.factories"):ClassLoader.getSystemResources( "META-INF / spring.factories")。
- これは、URL内のリソースパッケージを読み込み、その後トラバースURL、URLのファイルこれらのパッケージをプロパティファイルで、最後に返されたパッケージの良好な結果、彼のClassLoaderパラメータは、バックトラッキングを、彼はことを見たことEnableAutoConfiguration。
-
このロジックは、プロパティで取得したEnableAutoConfiguration.classの画像のクラス(クラス名)、その後、容器の中にそれらを追加します
- 要約文である:すべてのEnableAutoConfigurationの値は、META-INF / spring.factoriesを容器に加え内部に配置されたクラスパス。
- ソース(下記参照)
自動設定 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.data.cassandra.CassandraRepositoriesAutoConfiguration、\ 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.couchbase.CouchbaseReactiveDataAutoConfiguration、\ org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration、\ 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.neo4j.Neo4jRepositoriesAutoConfiguration、\ 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。 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.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration、\ org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration、\ org.springframework.boot.autoconfigure.session.SessionAutoConfiguration、\ 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.私たち
@Configuration //は、これは、容器の成分に添加することができる構成クラス、以前に書き込まれたコンフィギュレーションファイルと同じであることを示している // ; ConfigurationPropertiesは、指定されたクラスの関数開始 // このHttpPropertiesビュー、対応する値とのコンフィギュレーションファイルHttpPropertiesを入力しますバインド; // 容器HttpPropertiesに添加IOC @EnableConfigurationProperties({。HttpProperties クラス}) // 春@Conditional注釈の基礎となる // 指定された条件が満たされた場合、条件判定に応じて、全体の構成は、クラス内部に配置されていますそれが有効になります。 // ここにある場合は、現在のアプリケーションは、Webアプリケーションは、力に、現在のコンフィギュレーションクラスであるかどうかを判断するためにされた意味 (@ConditionalOnWebApplication タイプの = Type.SERVLET ) // SpringMVCの中で対処する文字化け、現在のプロジェクトを決定し、この種のCharacterEncodingFilterを持っていますフィルタ; @ConditionalOnClass({。CharacterEncodingFilterのクラス}) // 構成プロファイルがあるかどうかを決定します。spring.http.encoding.enabledは; // ない場合は、判断が確立されている // また、我々はpring.http.encoding.enabled =真のプロファイル設定をしない場合でも、力のデフォルト; @ConditionalOnProperty( 接頭辞 = " spring.http.encoding " 、 値 = { " 有効" }、 matchIfMissing = trueに ) パブリック クラスHttpEncodingAutoConfiguration { // 彼はすでにマッピングされたSpringBootプロフィール プライベート最終的な特性エンコーディング; / / 容器からのパラメータの唯一のコンストラクタパラメータ値が取る場合 公衆HttpEncodingAutoConfiguration(HttpProperties特性){ 本の.properties = properties.getEncoding(); } //の中の成分の性質から、いくつかの値を取得する必要があり、コンテナにコンポーネントを追加 @Bean @ConditionalOnMissingBean //はこのコンポーネントなしで容器を分析? 公共CharacterEncodingFilter characterEncodingFilter(){ CharacterEncodingFilterフィルタ = 新しい新しいOrderedCharacterEncodingFilter(); filter.setEncoding(この.properties.getCharset()名()); filter.setForceRequestEncoding(この.properties.shouldForce(org.springframework.boot.autoconfigure.http .HttpProperties.Encoding.Type.REQUEST)); filter.setForceResponseEncoding(この.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE))。 リターンフィルタ。 } ... ... }
現在の判決の条件によっては、コンフィギュレーションクラスが有効であることを決定しました!
この構成でクラスを有効にしたら、このコンフィギュレーションクラスは、コンテナの様々な構成要素に追加され、これらの構成要素の特性は、クラスの対応するプロパティから取得され、結合プロファイルの特性であるこれらのクラスの各々を、
5.すべての属性は、設定ファイルで設定することが可能であるxxxxPropertiesクラスのラッパー、属性クラスに対応する機能を参照するように設定することができますどのようなコンフィギュレーションファイル
@ConfigurationProperties( 接頭辞 = 「spring.http 」 )// 豆結合プロファイルから指定された属性の値を取得し 、パブリック クラスHttpProperties { プライベートブールlogRequestDetails、 プライベート決勝HttpProperties.Encodingエンコーディング= 新新HttpProperties.Encoding(); 公衆HttpProperties(){ } パブリックブールisLogRequestDetails(){ 戻り 、この.logRequestDetailsを; } 公共 ボイドsetLogRequestDetails(ブールlogRequestDetails){ この .logRequestDetails =logRequestDetails; } 公共HttpProperties.EncodingのgetEncoding(){ 戻り 、この.encodingと、 } パブリック 静的 クラスエンコーディング{ パブリック 静的最終的な文字セットDEFAULT_CHARSET。 プライベート文字セットの文字セット。 プライベートブール力。 プライベートブールforceRequest。 プライベートブールforceResponse。 プライベート地図<ロケール、文字セット> マッピング。 ... ... } }
ヒントを参照して、プレフィックス内のコンフィギュレーション・ファイルに移動してみてください!
1)、SpringBootは自動的にクラスの多くをロードするように構成し始めるだろう
2)、我々はSpringBoot間で書かれたデフォルトの自動設定のクラスが存在しない関数に必要なことを確認します。
3)、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
4)、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性;
@Conditional
自动配置类必须在一定的条件下才能生效;
@Conditional派生注解(Spring注解版原生的@Conditional作用)
作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;
那么多的自动配置类,必须在一定的条件下才能生效;也就是说,我们加载了这么多的配置类,但不是所有的都生效了。
我们怎么知道哪些自动配置类生效;我们可以通过启用 debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;
#开启springboot的调试类 debug=true
Positive matches:(自动配置类启用的:正匹配)
Negative matches:(没有启动,没有匹配成功的自动配置类:负匹配)
Unconditional classes: (没有条件的类)