第4章 Spring Boot自动配置
自动配置概述
SpringBoot的两大核心
Spring Boot 框架的两大核心特性可以概括为“
启动器
”(Starter)和“自动配置
”(Auto-configuration)。
-
启动器(Starter):
Spring Boot 提供了一系列的 Starter POMs,它们是一组预定义的依赖关系。当你在项目中引入一个 Starter POM 时,它会自动包含所有必要的 Spring 组件以及合理的默认设置。开发者不需要手动管理复杂的依赖关系,也不需要担心版本冲突的问题,减少了配置上的出错可能。
-
自动配置(Auto-Configuration):
当添加了特定的 Starter POM 后,Spring Boot 会根据类路径上存在的 jar 包来自动配置 Bean(自动配置相关组件)(比如:SpringBoot发现类路径上存在mybatis相关的类,例如SqlSessionFactory.class,那么SpringBoot将自动配置mybatis相关的所有Bean。)。
如果开发者没有显式地提供任何与特定功能相关的配置,Spring Boot 将使用其默认配置来自动设置这些功能。当然,如果需要的话,用户也可以覆盖这些默认设置。
这两个特性结合在一起,使得使用 Spring Boot 开发应用程序变得更加简单快速,减少了大量的样板代码和重复配置的工作。让程序员专注业务逻辑的开发,在环境方面耗费最少的时间。
体会自动配置带来的便捷
拿SpringBoot集成MyBatis为例。
以前,在没有SpringBoot框架的时候,我们用Spring集成MyBatis框架,需要进行如下的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 数据源配置 --><bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mydb"/><property name="username" value="root"/><property name="password" value="password"/></bean><!-- SqlSessionFactory --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mapper/*.xml"/><property name="typeAliasesPackage" value="com.example.model"/></bean><!-- Mapper 扫描器 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.mapper"/><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/></bean><!-- 事务管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 开启事务注解 --><tx:annotation-driven transaction-manager="transactionManager"/><!-- 扫描 service 层的包 --><context:component-scan base-package="com.example.service"/></beans>
通过以上的配置可以看到Spring集成MyBatis的时候,需要手动提供BasicDataSource
、SqlSessionFactoryBean
、MapperScannerConfigurer
、DataSourceTransactionManager
等Bean的配置。
使用了Spring Boot框架之后,这些配置都不需要提供了,SpringBoot框架的自动配置机制可以全部按照默认的方式自动化完成。减少了大量的配置,在环境方面耗费很少的时间,让程序员更加专注业务逻辑的处理。我们只需要在
application.yml
中提供以下的配置即可:
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/springbootusername: rootpassword: 123456type: com.zaxxer.hikari.HikariDataSource
引入web启动器都有哪些组件会准备好
通过以下代码获取spring ioc容器中的所有注册的bean,一个Bean就是一个组件:
package com.liming.test;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;@SpringBootApplication
public class TestApplication {public static void main(String[] args) {ConfigurableApplicationContext applicationContext = SpringApplication.run(TestApplication.class, args);String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();for (String beanDefinitionName : beanDefinitionNames) {System.out.println(beanDefinitionName);}applicationContext.close();}}
在springboot没有引入任何启动器的情况下,默认提供了59
bean:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
testApplication
org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
org.springframework.boot.autoconfigure.AutoConfigurationPackages
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
propertySourcesPlaceholderConfigurer
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration
mbeanExporter
objectNamingStrategy
mbeanServer
org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
org.springframework.boot.context.internalConfigurationPropertiesBinder
org.springframework.boot.context.properties.BoundConfigurationProperties
org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.methodValidationExcludeFilter
spring.jmx-org.springframework.boot.autoconfigure.jmx.JmxProperties
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration
springApplicationAdminRegistrar
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration
forceAutoProxyCreatorToUseClassProxying
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration
applicationAvailability
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration
lifecycleProcessor
spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
spring.sql.init-org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties
org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
fileWatcher
sslPropertiesSslBundleRegistrar
sslBundleRegistry
spring.ssl-org.springframework.boot.autoconfigure.ssl.SslProperties
org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$ThreadPoolTaskExecutorBuilderConfiguration
threadPoolTaskExecutorBuilder
org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$TaskExecutorBuilderConfiguration
taskExecutorBuilder
org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$SimpleAsyncTaskExecutorBuilderConfiguration
simpleAsyncTaskExecutorBuilder
org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$TaskExecutorConfiguration
applicationTaskExecutor
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration
spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties
org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$ThreadPoolTaskSchedulerBuilderConfiguration
threadPoolTaskSchedulerBuilder
org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$TaskSchedulerBuilderConfiguration
taskSchedulerBuilder
org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$SimpleAsyncTaskSchedulerBuilderConfiguration
simpleAsyncTaskSchedulerBuilder
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration
spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties
org.springframework.aop.config.internalAutoProxyCreator
引入web启动器:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
可以发现,ioc容器中注册的bean总数量为160
个:
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
testApplication
org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory
org.springframework.boot.autoconfigure.AutoConfigurationPackages
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
propertySourcesPlaceholderConfigurer
org.springframework.boot.autoconfigure.ssl.SslAutoConfiguration
fileWatcher
sslPropertiesSslBundleRegistrar
sslBundleRegistry
org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor
org.springframework.boot.context.internalConfigurationPropertiesBinder
org.springframework.boot.context.properties.BoundConfigurationProperties
org.springframework.boot.context.properties.EnableConfigurationPropertiesRegistrar.methodValidationExcludeFilter
spring.ssl-org.springframework.boot.autoconfigure.ssl.SslProperties
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration$TomcatWebSocketConfiguration
websocketServletWebServerCustomizer
org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat
tomcatServletWebServerFactory
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
servletWebServerFactoryCustomizer
tomcatServletWebServerFactoryCustomizer
server-org.springframework.boot.autoconfigure.web.ServerProperties
webServerFactoryCustomizerBeanPostProcessor
errorPageRegistrarBeanPostProcessor
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletConfiguration
dispatcherServlet
spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration
dispatcherServletRegistration
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$ThreadPoolTaskExecutorBuilderConfiguration
threadPoolTaskExecutorBuilder
org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$TaskExecutorBuilderConfiguration
taskExecutorBuilder
org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$SimpleAsyncTaskExecutorBuilderConfiguration
simpleAsyncTaskExecutorBuilder
org.springframework.boot.autoconfigure.task.TaskExecutorConfigurations$TaskExecutorConfiguration
applicationTaskExecutor
org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration
spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration
error
beanNameViewResolver
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration
conventionErrorViewResolver
spring.web-org.springframework.boot.autoconfigure.web.WebProperties
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
errorAttributes
basicErrorController
errorPageCustomizer
preserveErrorControllerTargetClassPostProcessor
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration
welcomePageHandlerMapping
welcomePageNotAcceptableHandlerMapping
localeResolver
themeResolver
flashMapManager
mvcConversionService
mvcValidator
mvcContentNegotiationManager
requestMappingHandlerMapping
mvcPatternParser
mvcUrlPathHelper
mvcPathMatcher
viewControllerHandlerMapping
beanNameHandlerMapping
routerFunctionMapping
resourceHandlerMapping
mvcResourceUrlProvider
defaultServletHandlerMapping
requestMappingHandlerAdapter
handlerFunctionAdapter
mvcUriComponentsContributor
httpRequestHandlerAdapter
simpleControllerHandlerAdapter
handlerExceptionResolver
mvcViewResolver
mvcHandlerMappingIntrospector
viewNameTranslator
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter
defaultViewResolver
viewResolver
requestContextFilter
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
formContentFilter
org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration
mbeanExporter
objectNamingStrategy
mbeanServer
spring.jmx-org.springframework.boot.autoconfigure.jmx.JmxProperties
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration
springApplicationAdminRegistrar
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration$ClassProxyingConfiguration
forceAutoProxyCreatorToUseClassProxying
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration
org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration
applicationAvailability
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$Jackson2ObjectMapperBuilderCustomizerConfiguration
standardJacksonObjectMapperBuilderCustomizer
spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration
jacksonObjectMapperBuilder
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$ParameterNamesModuleConfiguration
parameterNamesModule
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperConfiguration
jacksonObjectMapper
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonMixinConfiguration
jsonMixinModuleEntries
jsonMixinModule
org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration
jsonComponentModule
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration
lifecycleProcessor
spring.lifecycle-org.springframework.boot.autoconfigure.context.LifecycleProperties
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration$StringHttpMessageConverterConfiguration
stringHttpMessageConverter
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration$MappingJackson2HttpMessageConverterConfiguration
mappingJackson2HttpMessageConverter
org.springframework.boot.autoconfigure.http.JacksonHttpMessageConvertersConfiguration
org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration
messageConverters
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties
org.springframework.boot.autoconfigure.sql.init.SqlInitializationAutoConfiguration
spring.sql.init-org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties
org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer$DependsOnDatabaseInitializationPostProcessor
org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$ThreadPoolTaskSchedulerBuilderConfiguration
threadPoolTaskSchedulerBuilder
org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$TaskSchedulerBuilderConfiguration
taskSchedulerBuilder
org.springframework.boot.autoconfigure.task.TaskSchedulingConfigurations$SimpleAsyncTaskSchedulerBuilderConfiguration
simpleAsyncTaskSchedulerBuilder
org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration
spring.task.scheduling-org.springframework.boot.autoconfigure.task.TaskSchedulingProperties
org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration
httpMessageConvertersRestClientCustomizer
restClientSsl
restClientBuilderConfigurer
restClientBuilder
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration
restTemplateBuilderConfigurer
restTemplateBuilder
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration$TomcatWebServerFactoryCustomizerConfiguration
tomcatWebServerFactoryCustomizer
org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
characterEncodingFilter
localeCharsetMappingsCustomizer
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
multipartConfigElement
multipartResolver
spring.servlet.multipart-org.springframework.boot.autoconfigure.web.servlet.MultipartProperties
org.springframework.aop.config.internalAutoProxyCreator
也就是说,引入了web启动器
后,ioc容器中增加了101
个bean对象(加入了101个组件)。这101
个bean对象都是为web开发而准备的,例如我们常见的:
- dispatcherServlet:DispatcherServlet 是 Spring MVC 的前端控制器,负责接收所有的 HTTP 请求,并将请求分发给适当的处理器(Controller)
- viewResolver:ViewResolver 是 Spring MVC 中用于将逻辑视图名称解析为实际视图对象的组件。它的主要作用是根据控制器返回的视图名称,找到对应的视图实现(如 JSP、Thymeleaf、Freemarker 等),并返回给 DispatcherServlet 用于渲染视图。
- characterEncodingFilter:字符集过滤器组件,解决请求和响应的乱码问题。
- mappingJackson2HttpMessageConverter:负责处理消息转换的组件。它可以将json字符串转换成java对象,也可以将java对象转换为json字符串。
- …
每一个组件都有它特定的功能。没有使用SpringBoot之前,以上的很多组件都是需要手动配置的。
默认的包扫描规则
springboot默认情况下只扫描
主入口类
所在包及子包下的类。这是因为@SpringBootApplication
注解被@ComponentScan
标注,代替spring以前的这个配置:<context:component-scan base-packages="主入口类所在包"/>
当然,我们也可以打破这个规则,通过以下两种方式:
- 第一种:@SpringBootApplication(scanBasePackages = “com”)
- 第二种:@ComponentScan(“com”)
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com")
public class TestApplication {}
默认配置
springboot为功能的实现提供了非常多的默认配置.
例如:tomcat服务器端口号在没有配置的情况下,默认是8080
当然,也可以在application.properties
文件中进行重新配置:
server.port=8081
这些配置最终都会通过@ConfigurationProperties(prefix="")
注解绑定到对应的bean的属性上。这个Bean我们一般称为属性类
。例如:
ServerProperties
:服务器属性类,专门负责配置服务器相关信息。
@ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)
public class ServerProperties {}
SpringBoot官方文档当中也有指导,告诉你都有哪些
属性类
,告诉你在application.properties
中都可以配置哪些东西。默认值都是什么:
自动配置是按需加载的
SpringBoot提供了非常多的自动配置类,有的是
web
相关的自动配置,有的是
-
这些自动配置类在哪里?
-
任何启动器都会关联引入这样一个启动器:
spring-boot-starter
,它是springboot框架最核心的启动器。 -
spring-boot-starter
又关联引入了spring-boot-autoconfigure
。所有的自动配置类都在这里。
-
SpringBoot框架提供的条件注解
如何做到按需加载的,依靠SpringBoot框架中的条件注解来实现的。Spring Boot框架中的@ConditionalOnXxx系列注解属于条件注解(Conditional Annotations),它们用于基于某些条件来决定是否应该创建一个或一组Bean。这些注解通常用在自动配置类上,以确保只有在特定条件满足时才会应用相应的配置。
这里是一些常见的@ConditionalOnXxx注解及其作用:
- @ConditionalOnClass:当指定的类存在时,才创建Bean。
- @ConditionalOnMissingClass:当指定的类不存在时,才创建Bean。
- @ConditionalOnBean:当容器中存在指定的Bean时,才创建Bean。
- @ConditionalOnMissingBean:当容器中不存在指定的Bean时,才创建Bean。
- @ConditionalOnProperty:当配置文件中存在指定的属性时,才创建Bean。也可以设置属性值需要匹配的值。
- @ConditionalOnResource:当指定的资源存在时,才创建Bean。
- @ConditionalOnWebApplication:当应用程序是Web应用时,才创建Bean。
- @ConditionalOnNotWebApplication:当应用程序不是Web应用时,才创建Bean。
使用这些注解可以帮助开发者根据不同的运行环境或配置来灵活地控制Bean的创建,从而实现更智能、更自动化的配置过程。这对于构建可插拔的模块化系统特别有用,因为可以根据实际需求选择性地启用或禁用某些功能。
假设我们来实现这样一个功能:如果IoC容器当中存在
A
Bean,就创建B
Bean,代码如下:
@Configuration
public class AppConfig {@Beanpublic A a(){return new A();}@ConditionalOnBean(A.class)@Beanpublic B b(){return new B();}
}
如果IoC容器当中不存在A
Bean,就创建B
Bean,代码如下:
@Configuration
public class AppConfig {@Beanpublic A a(){return new A();}@ConditionalOnMissingBean(A.class)@Beanpublic B b(){return new B();}
}
自动配置实现原理
我们来深入的分析一个问题:为什么导入
web启动器
,web开发相关的自动配置就会生效?
在程序没有开始执行之前都导入了哪些依赖
在程序没有开始运行之前,我们先来分析一下,当导入web启动器
之后,底层都一连串的导入了哪些依赖!
- 从这里开始:导入了
spring-boot-starter-web
【web启动器】 - 然后关联导入了
spring-boot-starter
、spring-boot-starter-json
、spring-boot-starter-tomcat
、spring-web
、spring-webmvc
- 注意:
spring-boot-starter
是springboot核心启动器,任何启动器在导入时,都会关联导入springboot核心启动器。
- 注意:
- 核心启动器导入之后,关联导入了一个jar包:
spring-boot-autoconfigure
。-
注意:这个jar包中存放的是springboot框架官方支持的自动配置类。
-
官方支持的自动配置类有多少个呢,可以通过下图位置查看:
-
得知springboot3.3.5
这个版本共152
个自动配置类。自动配置类的命名规则是XxxxAutoConfiguration
。
提示:哪个自动配置类生效,就代表哪个配置文件生效,那么对应的技术就完成了整合,就可以进行对应技术的开发。
从main方法开始执行之后都发生了什么
以上分析的是在项目结构上已经完成了相关依赖的导入,这些自动配置了导入到了项目当中,那么在运行时哪些自动配置类会被加载?哪些自动配置类会生效呢?我们接下来进行程序运行阶段的分析:
- 程序从main方法进入执行,主入口类上使用
@SpringBootApplication
进行了标注。 @SpringBootApplication
注解是复合注解,代表以下三个注解的功能:@SpringBootConfiguration
:它被@Configuration
标注,说明主入口类就是一个配置类,此时该配置开始加载。@ComponentScan
:默认扫描的是主入口所在包以及子包。因此spring-boot-autoconfigure
包是扫描不到的,按说XxxAutoConfiguration
自动配置类是无法加载的!!!那么这些自动配置类又是如何加载和生效的呢?@EnableAutoConfiguration
:自动配置类的加载和生效全靠它了。该注解被翻译为:启用自动配置。
@EnableAutoConfiguration
被@Import(AutoConfigurationImportSelector.class)
标注@Import(AutoConfigurationImportSelector.class)
的作用是:将AutoConfigurationImportSelector
作为一个Bean加载到IoC容器中。- 这个Bean的作用是:负责收集和选择所有符合条件的自动配置类。
- 添加断点,跟踪
AutoConfigurationImportSelector
源码:
通过跟踪得知,这152
个自动配置类的类名都会被加载到IoC容器中。注意:加载了152,并不是152个全部生效。
- 这
152
个自动配置类底层是怎么查找的?
通过以上源码跟踪,得知,是从下图位置加载的:
- 最终哪些自动配置类生效了?
最先获取到152
个,经过上图的一层一层的过滤(条件注解),最终筛选了26
个自动配置类,为什么这么少,因为只引入了web starter
。这26个配置就是做web开发需要的最少配置。
具体怎么排除的,请看以下解释:
- configurations = removeDuplicates(configurations);
去重:移除 configurations 列表中的重复项,确保每个配置类只出现一次。
- Set exclusions = getExclusions(annotationMetadata, attributes);
获取排除列表:从注解元数据和属性中获取需要排除的配置类名称集合。因为@EnableAutoConfiguration
注解还能这么用:@EnableAutoConfiguration(exclude = {排除列表}, excludeName = {排除列表})
- checkExcludedClasses(configurations, exclusions);
检查排除:验证 configurations 中是否有被排除的类,如果有,可能会抛出异常或记录警告。
- configurations.removeAll(exclusions);
移除排除项:从 configurations 列表中移除所有在 exclusions 集合中的配置类。
- configurations = getConfigurationClassFilter().filter(configurations);
过滤配置类:使用 ConfigurationClassFilter 对 configurations 进行进一步过滤。这一行通过条件注解进行判断,例如 @ConditionalOnClass、@ConditionalOnMissingBean 等。
- fireAutoConfigurationImportEvents(configurations, exclusions);
触发事件:触发自动配置导入事件,通知其他组件或监听器关于最终确定的配置类和排除的类。
自动配置类都干了啥
自动配置类导入了一堆相关的组件(一个组件一个功能),而每个组件获取配置时都是从属性类中获取,而属性类恰好又和配置文件绑定。
以DispatcherServletAutoConfiguration
自动配置类为例,这个自动配置类主要是配置了SpringMVC中的前端控制器。
请看源码:
通过以上源码得知,DispatcherServletConfiguration
组件的配置信息来源于WebMvcProperties
属性类。WebMvcProperties
类源码如下:
通过以上源码又得知,要对DispatcherServletConfiguration
进行配置的话,应该在application.properties
中使用这样的前缀配置:spring.mvc....
再来看嵌入式Web服务器工厂自定义程序自动配置
:EmbeddedWebServerFactoryCustomizerAutoConfiguration
,通俗讲:通过它可以配置web服务器。
请看源码:
通过以上源码得知,这个自动配置类中也有很多组件,有tomcat组件,有jetty组件。单独看Tomcat,要配置Tomcat服务器,需要参照ServerProperties
属性类,打开源码看看:
因此配置Tomcat服务器需要在application.properties
文件中使用这样的前缀配置:server.
总结自动配置原理
- 运行环境准备阶段
- 引入web启动器
- 最终传递引入了自动配置的jar包
- 自动配置的jar包中有152个自动配置类,到此运行环境准备完毕。
- 运行阶段
- @EnableAutoConfiguration 启用自动配置,将152个自动配置类全部加载到IoC容器中,然后根据开发场景筛选出必须的自动配置类。
- 自动配置类加载了一堆组件。
- 每个组件需要的数据来自属性类。
- 属性类又和配置文件绑定在一起。
- 因此,最终一句话:导入启动器,修改配置文件,就可以完成对应功能的开发。
相关文章:

第4章 Spring Boot自动配置
自动配置概述 SpringBoot的两大核心 Spring Boot 框架的两大核心特性可以概括为“启动器”(Starter)和“自动配置”(Auto-configuration)。 启动器(Starter): Spring Boot 提供了一系列的 Star…...

显存:存储,GPU:计算;Pipeline Parallelism(管道并行)
目录 显存:存储,GPU:计算 流水线切分策略:(数据并并,多头并行,单头MLP切片) 存储(显存)和计算(GPU)负载不均衡的问题 1,2,3,4,5指的计算任务(数据切分) 大方块代表GPU计算 黄色代表显存 解决办法:重计算和流水线切分策略 重计算策略: 流水线切分策略:…...

费曼路径积分简单示例
费曼路径积分简单示例 费曼路径积分是量子力学中的一种计算方法,它通过对所有可能路径的贡献进行积分,来计算粒子从一个点到另一个点的概率幅。与经典力学不同,经典力学中粒子沿着使作用量最小的路径运动,而在量子力学中…...

40分钟学 Go 语言高并发:【实战】并发安全的配置管理器(功能扩展)
【实战】并发安全的配置管理器(功能扩展) 一、扩展思考 分布式配置中心 实现配置的集中管理支持多节点配置同步实现配置的版本一致性 配置加密 敏感配置的加密存储配置的安全传输访问权限控制 配置格式支持 支持YAML、TOML等多种格式配置格式自动…...

麒麟安全增强-kysec
DAC: 自主访问控制是linux下默认的接入控制机制,通过对资源读、写、执行操作,保证系统安全 MAC:安全接入控制机制,由操作系统约束的访问控制,默认情况下,MAC不允许任何访问,用户可以自定义策略规则制定允许什么 ,从而避免很多攻击。 MAC强制访问控制常见的实现方式:…...

shell编程(8)
目录 一、until循环 示例 until 和 while 的区别 二、case语句 基本语法 示例 1. 简单的 case 语句 2. 使用通配符 3. 处理多个匹配 case 和 if 的比较 case 语句: if 语句: 三、基本函数 基本函数定义和调用 1. 定义一个简单的函数 2. …...

高级java每日一道面试题-2024年11月24日-JVM篇-说说对象分配规则?
如果有遗漏,评论区告诉我进行补充 面试官: 说说对象分配规则? 我回答: 在Java高级面试中,对象分配规则是一个核心考点,它涉及到JVM的内存管理、对象的创建和初始化等多个方面。以下是对Java对象分配规则的详细解释: 一、内存分配区域 J…...

进程间通信5:信号
引入 我们之前学习了信号量,信号量和信号可不是一个东西,不能混淆。 信号是什么以及一些基础概念 信号是一种让进程给其他进程发送异步消息的方式 信号是随时产生的,无法预测信号可以临时保存下来,之后再处理信号是异步发送的…...

性能测试及调优
一、性能测试介绍 1、什么叫做性能测试? (1)通过某些工具或手段来检测软件的某些指标是否达到了要求,这就是性能测试 (2)指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指…...

实战基于LangChain和ChatGLM私有化部署聊天机器人
本文主要阐述了如何使用第二代6B模型进行对话训练,以及如何通过微调来提高大模型的性能。文中提到了在8501端口上启动第二代6B模型,并使用极简模板进行请求。与第一代模型相比,第二代6B模型具有更强的对话能力,并且可以通过微调来…...

利用adb工具安装卸载安卓平板(手机)软件
参考链接: 1、ADB 操作命令详解及用法大全 2、全面掌握Android调试工具箱:ADB与实用程序实战 平时使用小米手机没有感觉,miui系统做的确实好。最近买了个水货学习系统平板(主要看重硬件配置,性价比很高,但…...

基于docker进行任意项目灵活发布
引言 不管是java还是python程序等,使用docker发布的优势有以下几点: 易于维护。直接docker命令进行管理,如docker stop、docker start等,快速方便无需各种进程查询关闭。环境隔离。项目代码任何依赖或设置都可以基本独立&#x…...

Datatables:监听行内文本框,进行行内数据修改;计算行总和
一、监听行内文本框,进行行内数据修改 效果 修改数量、单价会自动计算金额(金额数量*单价) 实现 1、增加行的class 2、数据监听、修改数值 "initComplete": function() {// 监听数量和单价输入框的变化$(document).on(input, .…...

对于某些原型或UI软件的个人看法(2024/11)
由于我这几天,一边敲代码,一边进行页面布局设计与编码,发现可能就一个卡片,我都得调很久样式,觉得这样改很累也没效率,页面也不是很美观。所以我想到了ui设计,我可以先进行ui设计,然…...

嵌入式硬件实战提升篇(二)PCB高速板设计 FPGA核心板带DDR3 PCB设计DDR全面解析
引言:设计一款高速板,供读者学习,FPGA核心板,带一颗DDR3内存,FPGA型号:XC6SLX16-2FTG256C。 随着嵌入式硬件技术的快速发展,高速板设计逐渐成为嵌入式系统设计中的核心技术之一。高速板的设计要…...

亚信安全携手飞书“走近先进” 与保隆科技探索制造业数字化转型
亚信安全携手飞书组织举办“走近先进”活动。近日活动“走近”了中国汽车供应链百强、上海市制造业五十强企业——上海保隆汽车科技股份有限公司(以下简称“保隆科技”)。活动围绕“突破桎梏 加速升级”的主题,聚焦企业数字化转型的核心议题&…...

【C++篇】排队的艺术:用生活场景讲解优先级队列的实现
文章目录 须知 💬 欢迎讨论:如果你在学习过程中有任何问题或想法,欢迎在评论区留言,我们一起交流学习。你的支持是我继续创作的动力! 👍 点赞、收藏与分享:觉得这篇文章对你有帮助吗࿱…...

VTK的基本概念(一)
文章目录 三维场景的基本要素1.灯光2.相机3.颜色4.纹理映射 三维场景的基本要素 1.灯光 在三维渲染场景中,可以有多个灯光的存在,灯光和相机是三维渲染场景的必备要素,如果没有指定的话,vtkRenderer会自动创建默认的灯光和相机。…...

error LNK2001: 无法解析的外部符号 memcpy strcmp strlen
0>LIBMY_static.lib(pixdesc.obj) : error LNK2001: 无法解析的外部符号 __imp_abort 10>LIBMY_static.lib(random_seed.obj) : error LNK2001: 无法解析的外部符号 __imp_abort 10>postprocess.obj : error LNK2001: 无法解析的外部符号 __imp_abort 10>LIBMY_sta…...

打造智能扩容新纪元:Kubernetes Custom Metrics深度解析
自定义指标:Kubernetes Auto Scaling的革命 1. 引言 1.1 Kubernetes与Auto Scaling Kubernetes作为当今容器编排的事实标准,提供了强大的自动化能力,其中Auto Scaling(自动扩缩容)是其核心特性之一。Auto Scaling允许Kubernetes集群根据当前负载动态调整资源,以应对不…...

【K8s】专题十五(4):Kubernetes 网络之 Calico 插件安装、切换网络模式、卸载
本文内容均来自个人笔记并重新梳理,如有错误欢迎指正! 如果对您有帮助,烦请点赞、关注、转发、订阅专栏! 专栏订阅入口 | 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 | 往期精彩文章 【Docker】(全…...

Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)
【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ UI部分暂时完结!!! 本章节优化了UI中物品描述的显示效果,技能描述的显示效果 并且可以批…...

c++(入门)
1. 引用 引用的定义 引用是另一个变量的别名,它在声明时必须被初始化,并且一旦初始化后,它就始终引用那个变量。 引用的语法 引用的声明方式是在变量名前加上&符号。 引用的特点 引用必须在声明时初始化。引用一旦初始化后&#x…...

【优选算法】前缀和
目录 一、[【模板】前缀和](https://www.nowcoder.com/practice/acead2f4c28c401889915da98ecdc6bf?tpId230&tqId2021480&ru/exam/oj&qru/ta/dynamic-programming/question-ranking&sourceUrl%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595…...

Spring Bean 的生命周期详解
所谓万物皆对象,对于一个 bean 而言,从出生到死亡,他要经历哪些阶段呢? 生命周期 理解对象的生命周期,可以帮助我们更好的做一些扩展。 一个对象从被创建到被垃圾回收,可以大致分为这 5 个阶段:…...

MySQL【知识改变命运】12
视图 1:什么是视图2:创建视图使用视图(视图的好处)2.1.隐藏敏感字段2.2.对外提供统一访问3:视图和真实表进⾏表连接查询 4:修改视图数据4.1:通过真实表修改数据,会影响视图4.2&#…...

shell编程(完整版)
目录 一、shell脚本解释器 二、shell脚本的执行 三、变量的使用 四、永久环境变量 按用户设置永久环境变量 文件路径: 示例步骤: 删除永久环境变量 五、脚本程序传递参数怎么实现 六、用编程进行数学运算 shell中利用expr进行运算 运算与变量…...

数字逻辑(一)——导论
1.导论 1.1什么是数字逻辑? 数字逻辑是指在数字电路设计、计算机科学领域中对于离散的二进制信号进行逻辑处理、运算、存储和传输的基本原理和方法。 1.2数字量和模拟量的区别 数字量:在时间上和数量上都是离散的、不连续的物理量。模拟量࿱…...

量化交易系统开发-实时行情自动化交易-4.4.做市策略
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说做市策略原理。 做市策…...

《线性代数的本质》
之前收藏的一门课,刚好期末复习,顺便看一看哈哈 课程链接:【线性代数的本质】合集-转载于3Blue1Brown官方双语】 向量究竟是什么 线性代数中最基础、最根源的组成部分就是向量,需要先明白什么是向量 不同专业对向量的看法 物理专…...