序
本文主要研究一下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