Stories

Detail Return Return

聊聊spring-boot-autoconfigure的模塊化 - Stories Detail

本文主要研究一下spring-boot-autoconfigure的模塊化

現狀

spring-boot-autoconfigure git:(v2.3.12.RELEASE) ✗ tree -L 8 -I "test"

.
├── build.gradle
└── src
    └── main
        ├── java
        │   └── org
        │       └── springframework
        │           └── boot
        │               └── autoconfigure
        │                   ├── AbstractDependsOnBeanFactoryPostProcessor.java
        │                   ├── AutoConfigurationExcludeFilter.java
        │                   ├── AutoConfigurationImportEvent.java
        │                   ├── AutoConfigurationImportFilter.java
        │                   ├── AutoConfigurationImportListener.java
        │                   ├── AutoConfigurationImportSelector.java
        │                   ├── AutoConfigurationMetadata.java
        │                   ├── AutoConfigurationMetadataLoader.java
        │                   ├── AutoConfigurationPackage.java
        │                   ├── AutoConfigurationPackages.java
        │                   ├── AutoConfigurationSorter.java
        │                   ├── AutoConfigurations.java
        │                   ├── AutoConfigureAfter.java
        │                   ├── AutoConfigureBefore.java
        │                   ├── AutoConfigureOrder.java
        │                   ├── BackgroundPreinitializer.java
        │                   ├── EnableAutoConfiguration.java
        │                   ├── ImportAutoConfiguration.java
        │                   ├── ImportAutoConfigurationImportSelector.java
        │                   ├── SharedMetadataReaderFactoryContextInitializer.java
        │                   ├── SpringBootApplication.java
        │                   ├── admin
        │                   ├── amqp
        │                   ├── aop
        │                   ├── availability
        │                   ├── batch
        │                   ├── cache
        │                   ├── cassandra
        │                   ├── codec
        │                   ├── condition
        │                   ├── context
        │                   ├── couchbase
        │                   ├── dao
        │                   ├── data
        │                   ├── diagnostics
        │                   ├── domain
        │                   ├── elasticsearch
        │                   ├── flyway
        │                   ├── freemarker
        │                   ├── groovy
        │                   ├── gson
        │                   ├── h2
        │                   ├── hateoas
        │                   ├── hazelcast
        │                   ├── http
        │                   ├── influx
        │                   ├── info
        │                   ├── integration
        │                   ├── jackson
        │                   ├── jdbc
        │                   ├── jersey
        │                   ├── jms
        │                   ├── jmx
        │                   ├── jooq
        │                   ├── jsonb
        │                   ├── kafka
        │                   ├── ldap
        │                   ├── liquibase
        │                   ├── logging
        │                   ├── mail
        │                   ├── mongo
        │                   ├── mustache
        │                   ├── orm
        │                   ├── package-info.java
        │                   ├── quartz
        │                   ├── r2dbc
        │                   ├── rsocket
        │                   ├── security
        │                   ├── sendgrid
        │                   ├── session
        │                   ├── solr
        │                   ├── task
        │                   ├── template
        │                   ├── thymeleaf
        │                   ├── transaction
        │                   ├── validation
        │                   ├── web
        │                   ├── webservices
        │                   └── websocket
        └── resources
            └── META-INF
                ├── additional-spring-configuration-metadata.json
                └── spring.factories

67 directories, 25 files
可以看到spring-boot-autoconfigure這個模塊包含了很多組件的autoconfig配置,比如cache、dao、kafka、solr等等

spring.factories

其spring.factories包含如下這些自動配置

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener

# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition

# 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.context.ConfigurationPropertiesAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
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.ElasticsearchDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\
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.r2dbc.R2dbcDataAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\
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.ElasticsearchRestClientAutoConfiguration,\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\
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.jersey.JerseyAutoConfiguration,\
org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\
org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\
org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\
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.r2dbc.R2dbcAutoConfiguration,\
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

# Failure analyzers
org.springframework.boot.diagnostics.FailureAnalyzer=\
org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\
org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\
org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\
org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\
org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer

# Template availability providers
org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\
org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\
org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider

build.gradle

plugins {
    id "java-library"
    id "org.jetbrains.kotlin.jvm"
    id "org.springframework.boot.auto-configuration"
    id "org.springframework.boot.conventions"
    id "org.springframework.boot.deployed"
    id "org.springframework.boot.optional-dependencies"
}

description = "Spring Boot AutoConfigure"

dependencies {
    api(project(":spring-boot-project:spring-boot"))

    optional("com.atomikos:transactions-jdbc")
    optional("com.atomikos:transactions-jta")
    optional("com.fasterxml.jackson.core:jackson-databind")
    optional("com.fasterxml.jackson.dataformat:jackson-dataformat-cbor")
    optional("com.fasterxml.jackson.dataformat:jackson-dataformat-xml")
    optional("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
    optional("com.fasterxml.jackson.module:jackson-module-parameter-names")
    optional("com.google.code.gson:gson")
    optional("com.hazelcast:hazelcast")
    optional("com.hazelcast:hazelcast-client")
    optional("com.hazelcast:hazelcast-spring")
    optional("com.h2database:h2")
    optional("com.nimbusds:oauth2-oidc-sdk")
    optional("com.samskivert:jmustache")
    optional("com.sun.mail:jakarta.mail")
    optional("de.flapdoodle.embed:de.flapdoodle.embed.mongo")
    optional("io.lettuce:lettuce-core")
    optional("io.projectreactor.netty:reactor-netty")
    optional("io.r2dbc:r2dbc-spi")
    optional("io.r2dbc:r2dbc-pool")
    optional("io.rsocket:rsocket-core")
    optional("io.rsocket:rsocket-transport-netty")
    optional("io.undertow:undertow-servlet") {
        exclude group: "org.jboss.spec.javax.annotation", module: "jboss-annotations-api_1.2_spec"
        exclude group: "org.jboss.spec.javax.servlet", module: "jboss-servlet-api_4.0_spec"
    }
    optional("io.undertow:undertow-websockets-jsr") {
        exclude group: "org.jboss.spec.javax.annotation", module: "jboss-annotations-api_1.2_spec"
        exclude group: "org.jboss.spec.javax.servlet", module: "jboss-servlet-api_4.0_spec"
    }
    optional("jakarta.jms:jakarta.jms-api")
    optional("jakarta.mail:jakarta.mail-api")
    optional("jakarta.json.bind:jakarta.json.bind-api")
    optional("jakarta.persistence:jakarta.persistence-api")
    optional("jakarta.validation:jakarta.validation-api")
    optional("jakarta.ws.rs:jakarta.ws.rs-api")
    optional("javax.cache:cache-api")
    optional("javax.money:money-api")
    optional("net.sf.ehcache:ehcache")
    optional("org.apache.activemq:activemq-broker")
    optional("org.apache.activemq:artemis-jms-client")
    optional("org.apache.activemq:artemis-jms-server")
    optional("org.apache.commons:commons-dbcp2")
    optional("org.apache.kafka:kafka-streams")
    optional("org.apache.solr:solr-solrj")
    optional("org.apache.tomcat.embed:tomcat-embed-core")
    optional("org.apache.tomcat.embed:tomcat-embed-el")
    optional("org.apache.tomcat.embed:tomcat-embed-websocket")
    optional("org.apache.tomcat:tomcat-jdbc")
    optional("org.codehaus.btm:btm")
    optional("org.codehaus.groovy:groovy-templates")
    optional("com.github.ben-manes.caffeine:caffeine")
    optional("com.github.mxab.thymeleaf.extras:thymeleaf-extras-data-attribute")
    optional("com.sendgrid:sendgrid-java")
    optional("com.unboundid:unboundid-ldapsdk")
    optional("com.zaxxer:HikariCP")
    optional("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect")
    optional("org.aspectj:aspectjweaver")
    optional("org.eclipse.jetty:jetty-webapp")
    optional("org.eclipse.jetty:jetty-reactive-httpclient")
    optional("org.eclipse.jetty.websocket:javax-websocket-server-impl")
    optional("org.ehcache:ehcache")
    optional("org.elasticsearch.client:elasticsearch-rest-client")
    optional("org.elasticsearch.client:elasticsearch-rest-high-level-client")
    optional("org.flywaydb:flyway-core")
    optional("org.freemarker:freemarker")
    optional("org.glassfish.jersey.core:jersey-server")
    optional("org.glassfish.jersey.containers:jersey-container-servlet-core")
    optional("org.glassfish.jersey.containers:jersey-container-servlet")
    optional("org.glassfish.jersey.ext:jersey-spring5")
    optional("org.glassfish.jersey.media:jersey-media-json-jackson")
    optional("org.hibernate:hibernate-core")
    optional("org.hibernate:hibernate-jcache")
    optional("org.hibernate.validator:hibernate-validator")
    optional("org.infinispan:infinispan-component-annotations")
    optional("org.infinispan:infinispan-jcache")
    optional("org.infinispan:infinispan-spring5-embedded")
    optional("org.influxdb:influxdb-java")
    optional("org.jooq:jooq")
    optional("org.liquibase:liquibase-core")
    optional("org.messaginghub:pooled-jms")
    optional("org.mongodb:mongodb-driver-reactivestreams")
    optional("org.mongodb:mongodb-driver-sync")
    optional("org.quartz-scheduler:quartz")
    optional("org.springframework:spring-jdbc")
    optional("org.springframework.integration:spring-integration-core")
    optional("org.springframework.integration:spring-integration-jdbc")
    optional("org.springframework.integration:spring-integration-jmx")
    optional("org.springframework.integration:spring-integration-rsocket")
    optional("org.springframework:spring-jms")
    optional("org.springframework:spring-orm")
    optional("org.springframework:spring-tx")
    optional("org.springframework:spring-web")
    optional("org.springframework:spring-websocket")
    optional("org.springframework:spring-webflux")
    optional("org.springframework:spring-webmvc")
    optional("org.springframework.batch:spring-batch-core")
    optional("org.springframework.data:spring-data-couchbase")
    optional("org.springframework.data:spring-data-jpa")
    optional("org.springframework.data:spring-data-rest-webmvc")
    optional("org.springframework.data:spring-data-cassandra")
    optional("org.springframework.data:spring-data-elasticsearch") {
        exclude group: "org.elasticsearch.client", module: "transport"
    }
    optional("org.springframework.data:spring-data-jdbc")
    optional("org.springframework.data:spring-data-ldap")
    optional("org.springframework.data:spring-data-mongodb")
    optional("org.springframework.data:spring-data-neo4j")
    optional("org.springframework.data:spring-data-r2dbc")
    optional("org.springframework.data:spring-data-redis")
    optional("org.springframework.data:spring-data-solr")
    optional("org.springframework.hateoas:spring-hateoas")
    optional("org.springframework.security:spring-security-acl")
    optional("org.springframework.security:spring-security-config")
    optional("org.springframework.security:spring-security-data")
    optional("org.springframework.security:spring-security-oauth2-client")
    optional("org.springframework.security:spring-security-oauth2-jose")
    optional("org.springframework.security:spring-security-oauth2-resource-server")
    optional("org.springframework.security:spring-security-rsocket")
    optional("org.springframework.security:spring-security-saml2-service-provider")
    optional("org.springframework.security:spring-security-web")
    optional("org.springframework.session:spring-session-core")
    optional("org.springframework.session:spring-session-data-mongodb")
    optional("org.springframework.session:spring-session-data-redis")
    optional("org.springframework.session:spring-session-hazelcast")
    optional("org.springframework.session:spring-session-jdbc")
    optional("org.springframework.amqp:spring-rabbit")
    optional("org.springframework.kafka:spring-kafka")
    optional("org.springframework.ws:spring-ws-core")
    optional("org.thymeleaf:thymeleaf")
    optional("org.thymeleaf:thymeleaf-spring5")
    optional("org.thymeleaf.extras:thymeleaf-extras-java8time")
    optional("org.thymeleaf.extras:thymeleaf-extras-springsecurity5")
    optional("redis.clients:jedis")

    testImplementation(project(":spring-boot-project:spring-boot-tools:spring-boot-test-support"))
    testImplementation(project(":spring-boot-project:spring-boot-test"))
    testImplementation("ch.qos.logback:logback-classic")
    testImplementation("commons-fileupload:commons-fileupload")
    testImplementation("com.atomikos:transactions-jms")
    testImplementation("com.ibm.db2:jcc")
    testImplementation("com.jayway.jsonpath:json-path")
    testImplementation("com.squareup.okhttp3:mockwebserver")
    testImplementation("com.sun.xml.messaging.saaj:saaj-impl")
    testImplementation("io.projectreactor:reactor-test")
    testImplementation("io.r2dbc:r2dbc-h2")
    testImplementation("jakarta.json:jakarta.json-api")
    testImplementation("jakarta.xml.ws:jakarta.xml.ws-api")
    testImplementation("mysql:mysql-connector-java")
    testImplementation("org.apache.johnzon:johnzon-jsonb")
    testImplementation("org.apache.logging.log4j:log4j-to-slf4j")
    testImplementation("org.apache.tomcat.embed:tomcat-embed-jasper")
    testImplementation("org.assertj:assertj-core")
    testImplementation("org.awaitility:awaitility")
    testImplementation("org.hsqldb:hsqldb")
    testImplementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    testImplementation("org.junit.jupiter:junit-jupiter")
    testImplementation("org.mockito:mockito-core")
    testImplementation("org.neo4j:neo4j-ogm-bolt-native-types")
    testImplementation("org.neo4j:neo4j-ogm-http-driver")
    testImplementation("org.neo4j:neo4j-ogm-embedded-driver")
    testImplementation("org.springframework:spring-test")
    testImplementation("org.springframework.kafka:spring-kafka-test")
    testImplementation("org.springframework.security:spring-security-test")
    testImplementation("org.testcontainers:cassandra")
    testImplementation("org.testcontainers:couchbase")
    testImplementation("org.testcontainers:elasticsearch")
    testImplementation("org.testcontainers:junit-jupiter")
    testImplementation("org.testcontainers:mongodb")
    testImplementation("org.testcontainers:testcontainers")
    testImplementation("org.yaml:snakeyaml")

    testRuntimeOnly("org.jetbrains.kotlin:kotlin-reflect")
}
其build.gradle使用了optional的特性來依賴這些特定的組件

模塊化優化

在spring boot 4版本將這種"大單體"spring-boot-autoconfigure進行了拆分,這樣子每個模塊職責更加單一與清晰,應用也可以精簡依賴的jar包大小,也可以避免不同autoconfigure之間潛在的bean配置衝突,這塊與之前聊聊Spring AI autoconfigure模塊的拆分的改造類似

兼容處理

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-classic</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-test-classic</artifactId>
  <scope>test</scope>
</dependency>
為了升級方便,可以依賴spring-boot-starter-classic進行一鍵升級

spring-boot-starter-classic

starter/spring-boot-starter-classic/build.gradle

plugins {
    id "org.springframework.boot.starter"
}

description = "Core classic starter, including full auto-configuration support, logging and YAML"

dependencies {
    api(project(":starter:spring-boot-starter"))

    api(project(":module:spring-boot-autoconfigure-classic"))
}
它依賴了spring-boot-starter以及spring-boot-autoconfigure-classic

spring-boot-autoconfigure-classic

module/spring-boot-autoconfigure-classic/build.gradle

plugins {
    id "java-library"
    id "org.springframework.boot.deployed"
}

description = "Spring Boot AutoConfigure Classic"

dependencies {
    api(project(":core:spring-boot-autoconfigure"))
    api(project(":module:spring-boot-autoconfigure-classic-modules"))
}
它依賴了spring-boot-autoconfigure-classic-modules

spring-boot-autoconfigure-classic-modules

module/spring-boot-autoconfigure-classic-modules/build.gradle

plugins {
    id "java-library"
    id "org.springframework.boot.deployed"
}

description = "Spring Boot AutoConfigure Classic Modules"

// NOTE: This module is broken out so that direct starter dependencies are
// closer and will be resolved by Maven without the exclusions

dependencies {
    api(project(":module:spring-boot-activemq")) {
        transitive = false
    }
    api(project(":module:spring-boot-amqp")) {
        transitive = false
    }
    api(project(":module:spring-boot-artemis")) {
        transitive = false
    }
    api(project(":module:spring-boot-batch")) {
        transitive = false
    }
    api(project(":module:spring-boot-cache")) {
        transitive = false
    }
    api(project(":module:spring-boot-cassandra")) {
        transitive = false
    }
    api(project(":module:spring-boot-cloudfoundry")) {
        transitive = false
    }
    api(project(":module:spring-boot-couchbase")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-cassandra")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-commons")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-couchbase")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-elasticsearch")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-jdbc")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-jpa")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-ldap")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-mongodb")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-neo4j")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-r2dbc")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-redis")) {
        transitive = false
    }
    api(project(":module:spring-boot-data-rest")) {
        transitive = false
    }
    api(project(":module:spring-boot-elasticsearch")) {
        transitive = false
    }
    api(project(":module:spring-boot-flyway")) {
        transitive = false
    }
    api(project(":module:spring-boot-freemarker")) {
        transitive = false
    }
    api(project(":module:spring-boot-graphql")) {
        transitive = false
    }
    api(project(":module:spring-boot-groovy-templates")) {
        transitive = false
    }
    api(project(":module:spring-boot-gson")) {
        transitive = false
    }
    api(project(":module:spring-boot-h2console")) {
        transitive = false
    }
    api(project(":module:spring-boot-hateoas")) {
        transitive = false
    }
    api(project(":module:spring-boot-hazelcast")) {
        transitive = false
    }
    api(project(":module:spring-boot-health")) {
        transitive = false
    }
    api(project(":module:spring-boot-hibernate")) {
        transitive = false
    }
    api(project(":module:spring-boot-http-client")) {
        transitive = false
    }
    api(project(":module:spring-boot-http-codec")) {
        transitive = false
    }
    api(project(":module:spring-boot-http-converter")) {
        transitive = false
    }
    api(project(":module:spring-boot-integration")) {
        transitive = false
    }
    api(project(":module:spring-boot-jackson")) {
        transitive = false
    }
    api(project(":module:spring-boot-jdbc")) {
        transitive = false
    }
    api(project(":module:spring-boot-jetty")) {
        transitive = false
    }
    api(project(":module:spring-boot-jms")) {
        transitive = false
    }
    api(project(":module:spring-boot-jooq")) {
        transitive = false
    }
    api(project(":module:spring-boot-jpa")) {
        transitive = false
    }
    api(project(":module:spring-boot-jsonb")) {
        transitive = false
    }
    api(project(":module:spring-boot-kafka")) {
        transitive = false
    }
    api(project(":module:spring-boot-kotlin-serialization")) {
        transitive = false
    }
    api(project(":module:spring-boot-ldap")) {
        transitive = false
    }
    api(project(":module:spring-boot-liquibase")) {
        transitive = false
    }
    api(project(":module:spring-boot-mail")) {
        transitive = false
    }
    api(project(":module:spring-boot-micrometer-metrics")) {
        transitive = false
    }
    api(project(":module:spring-boot-micrometer-observation")) {
        transitive = false
    }
    api(project(":module:spring-boot-micrometer-tracing")) {
        transitive = false
    }
    api(project(":module:spring-boot-mongodb")) {
        transitive = false
    }
    api(project(":module:spring-boot-mustache")) {
        transitive = false
    }
    api(project(":module:spring-boot-neo4j")) {
        transitive = false
    }
    api(project(":module:spring-boot-netty")) {
        transitive = false
    }
    api(project(":module:spring-boot-opentelemetry")) {
        transitive = false
    }
    api(project(":module:spring-boot-pulsar")) {
        transitive = false
    }
    api(project(":module:spring-boot-quartz")) {
        transitive = false
    }
    api(project(":module:spring-boot-r2dbc")) {
        transitive = false
    }
    api(project(":module:spring-boot-reactor")) {
        transitive = false
    }
    api(project(":module:spring-boot-reactor-netty")) {
        transitive = false
    }
    api(project(":module:spring-boot-restclient")) {
        transitive = false
    }
    api(project(":module:spring-boot-rsocket")) {
        transitive = false
    }
    api(project(":module:spring-boot-security")) {
        transitive = false
    }
    api(project(":module:spring-boot-security-oauth2-authorization-server")) {
        transitive = false
    }
    api(project(":module:spring-boot-security-oauth2-client")) {
        transitive = false
    }
    api(project(":module:spring-boot-security-oauth2-resource-server")) {
        transitive = false
    }
    api(project(":module:spring-boot-security-saml2")) {
        transitive = false
    }
    api(project(":module:spring-boot-sendgrid")) {
        transitive = false
    }
    api(project(":module:spring-boot-servlet")) {
        transitive = false
    }
    api(project(":module:spring-boot-session")) {
        transitive = false
    }
    api(project(":module:spring-boot-session-data-redis")) {
        transitive = false
    }
    api(project(":module:spring-boot-session-jdbc")) {
        transitive = false
    }
    api(project(":module:spring-boot-sql")) {
        transitive = false
    }
    api(project(":module:spring-boot-thymeleaf")) {
        transitive = false
    }
    api(project(":module:spring-boot-tomcat")) {
        transitive = false
    }
    api(project(":module:spring-boot-transaction")) {
        transitive = false
    }
    api(project(":module:spring-boot-validation")) {
        transitive = false
    }
    api(project(":module:spring-boot-webclient")) {
        transitive = false
    }
    api(project(":module:spring-boot-webflux")) {
        transitive = false
    }
    api(project(":module:spring-boot-webmvc")) {
        transitive = false
    }
    api(project(":module:spring-boot-webservices")) {
        transitive = false
    }
    api(project(":module:spring-boot-websocket")) {
        transitive = false
    }
    api(project(":module:spring-boot-web-server")) {
        transitive = false
    }
    api(project(":module:spring-boot-zipkin")) {
        transitive = false
    }
}
可以看到之前的spring-boot-autoconfigure包,現在拆分到了各種spring-boot-{module}模塊中,比如spring-boot-cache模塊提供了之前spring-boot-autoconfigure包中的cache部分的autoconfigure代碼
spring-boot-cache git:(v4.0.0-RC1) ✗ tree -L 9 -I "test"
.
├── build.gradle
└── src
    ├── dockerTest
    │   └── java
    │       └── org
    │           └── springframework
    │               └── boot
    │                   └── cache
    │                       └── metrics
    │                           └── RedisCacheMetricsTests.java
    └── main
        ├── java
        │   └── org
        │       └── springframework
        │           └── boot
        │               └── cache
        │                   ├── actuate
        │                   │   └── endpoint
        │                   ├── autoconfigure
        │                   │   ├── Cache2kBuilderCustomizer.java
        │                   │   ├── Cache2kCacheConfiguration.java
        │                   │   ├── CacheAutoConfiguration.java
        │                   │   ├── CacheCondition.java
        │                   │   ├── CacheConfigurations.java
        │                   │   ├── CacheManagerCustomizer.java
        │                   │   ├── CacheManagerCustomizers.java
        │                   │   ├── CacheProperties.java
        │                   │   ├── CachesEndpointAutoConfiguration.java
        │                   │   ├── CaffeineCacheConfiguration.java
        │                   │   ├── CouchbaseCacheConfiguration.java
        │                   │   ├── CouchbaseCacheManagerBuilderCustomizer.java
        │                   │   ├── GenericCacheConfiguration.java
        │                   │   ├── HazelcastCacheConfiguration.java
        │                   │   ├── HazelcastJCacheCustomizationConfiguration.java
        │                   │   ├── InfinispanCacheConfiguration.java
        │                   │   ├── JCacheCacheConfiguration.java
        │                   │   ├── JCacheManagerCustomizer.java
        │                   │   ├── JCachePropertiesCustomizer.java
        │                   │   ├── NoOpCacheConfiguration.java
        │                   │   ├── RedisCacheConfiguration.java
        │                   │   ├── RedisCacheManagerBuilderCustomizer.java
        │                   │   ├── SimpleCacheConfiguration.java
        │                   │   ├── metrics
        │                   │   └── package-info.java
        │                   └── metrics
        │                       ├── Cache2kCacheMeterBinderProvider.java
        │                       ├── CacheMeterBinderProvider.java
        │                       ├── CacheMetricsRegistrar.java
        │                       ├── CaffeineCacheMeterBinderProvider.java
        │                       ├── HazelcastCacheMeterBinderProvider.java
        │                       ├── JCacheCacheMeterBinderProvider.java
        │                       ├── RedisCacheMeterBinderProvider.java
        │                       ├── RedisCacheMetrics.java
        │                       └── package-info.java
        └── resources
            └── META-INF
                ├── additional-spring-configuration-metadata.json
                └── spring
                    └── org.springframework.boot.autoconfigure.AutoConfiguration.imports

23 directories, 37 files

小結

spring boot 4.x版本對spring-boot-autoconfigure進行了拆分,之前這個包是一個"大單體",雖然通過optional把各種依賴集成在一起,但是應用還是需要依賴這麼大的一個jar包,而且不同autoconfigure可能會有潛在的配置衝突,這塊改造跟之前聊聊Spring AI autoconfigure模塊的拆分的改造類似。

doc

  • Modularizing Spring Boot
user avatar u_14540126 Avatar kk_64ec9e6b37cb5 Avatar susuhhhhhh Avatar alluxio_com Avatar
Favorites 4 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.