SpringBoot成长记8:SpringBoot实现自动装配配置,第三方功能的扩展之处

file

前面我们摸清楚了整个invokeBeanFactoryPostProcessors方法的if-else逻辑和3个for循环的核心脉络逻辑。

接下来我们来看下细节,我会通过抓大放小的思想,带大家看到在扩展点执行的过程中,最最要的有哪一些。

SpringBoot的自动装配配置如何做到的、第三方技术如何进行扩展的。

SpringBoot的自动装配配置如何做到的?

if-else逻辑中哪些BeanFactoryPostProcessor执行了?

之前我们提到过,invokeBeanFactoryPostProcessors执行的BeanFactoryPostProcessor主要来源是容器的两个属性 beanFactoryPostProcessorsBeanDefinitionMap

首先这两个属性,会在之前执行扩展操作,比如listener或者initializer的方法时,设置进去值的。执行到invokeBeanFactoryPostProcessors时,之前会设置如下图所示的值:

file

从上图可以看出来,执行invokeBeanFactoryPostProcessors的时候已经有4个BeanFactoryPostProcessor。

当执行invokeBeanFactoryPostProcessors,核心脉络上一节我们分析出了是主要一个if-else+3个for循环组成的,这个if-else中有分了内部的、实现PriorityOrderd、Ordered、NonOrder这个四个顺序执行。结合上面4个BeanFactoryPostProcessor,整体执行如下图所示:

file

从图中可以看出来,非常关键的一点那就是:在执行扩展方法1的过程中,通过Spring内部的一个ConfigurationClassPostProcessor,补充了新的BeanDefinition,增加了新的BeanFactoryPostProcessor。

ConfigurationClassPostProcessor这个执行非常关键,因为它补充了新的BeanDefinition。

它核心用来进行加载ClassPath下所有java注解定义的BeanDefinition。比如:自己包下定义的@Service,@Component,@Controller@Configuration @Bean等注解定义的Bean,也包括外部的starter中@Configuration @Bean等配置。

也就是你定义的大多数bean和外部starter定义的Bean的BeanDefinition都会被放入到容器中。

另外,补充了新的BeanDefinition,这里我们简化了下,假设当前应用,只依赖了一个myBatis-starter,之后只会补充一个MyBatis相关的BeanDefinition,一个BeanFactoryPostProcessor—MapperScannerConfigurer。从名字上猜测,它应该是用来扫描MyBatis相关bean的。

invokeBeanFactoryPostProcessors的if-else逻辑中,触发了2个扩展操作,最后还会执行扩展方法2,之前的所有BeanFactoryPostProcessor,统一会执行扩展方法2。

扩展方法2执行的逻辑,基本没有什么核心的,这里我们就直接过了,你知道invokeBeanFactoryPostProcessors这里会触发这个扩展点,并且在扩展方法1之后执行就行了。

最终执行完if-else后,BeanFactory中的主要有如下的beanDefination:

beanDefinitionNames = {ArrayList@3752}  size = 164
 0 = "org.springframework.context.annotation.internalConfigurationAnnotationProcessor"
 1 = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor"
 2 = "org.springframework.context.annotation.internalCommonAnnotationProcessor"
 3 = "org.springframework.context.event.internalEventListenerProcessor"
 4 = "org.springframework.context.event.internalEventListenerFactory"
 5 = "learnSpringBootApplication"
 6 = "org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory"
 7 = "userController"
 8 = "myBeanPostProcessor"
 9 = "userServiceImpl"
 10 = "userMapper"
 11 = "org.springframework.boot.autoconfigure.AutoConfigurationPackages"
 12 = "org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration"
 13 = "propertySourcesPlaceholderConfigurer"
 14 = "org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration$TomcatWebSocketConfiguration"
 15 = "websocketServletWebServerCustomizer"
 16 = "org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration"
 17 = "org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryConfiguration$EmbeddedTomcat"
 18 = "tomcatServletWebServerFactory"
 19 = "org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration"
 20 = "servletWebServerFactoryCustomizer"
 21 = "tomcatServletWebServerFactoryCustomizer"
 22 = "org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor"
 23 = "org.springframework.boot.context.internalConfigurationPropertiesBinderFactory"
 24 = "org.springframework.boot.context.internalConfigurationPropertiesBinder"
 25 = "org.springframework.boot.context.properties.ConfigurationPropertiesBeanDefinitionValidator"
 26 = "org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata"
 27 = "server-org.springframework.boot.autoconfigure.web.ServerProperties"
 28 = "webServerFactoryCustomizerBeanPostProcessor"
 29 = "errorPageRegistrarBeanPostProcessor"
 30 = "org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletConfiguration"
 31 = "dispatcherServlet"
 32 = "spring.mvc-org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties"
 33 = "spring.http-org.springframework.boot.autoconfigure.http.HttpProperties"
 34 = "org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration$DispatcherServletRegistrationConfiguration"
 35 = "dispatcherServletRegistration"
 36 = "org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration"
 37 = "org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration"
 38 = "taskExecutorBuilder"
 39 = "applicationTaskExecutor"
 40 = "spring.task.execution-org.springframework.boot.autoconfigure.task.TaskExecutionProperties"
 41 = "org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration"
 42 = "defaultValidator"
 43 = "methodValidationPostProcessor"
 44 = "org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration"
 45 = "error"
 46 = "beanNameViewResolver"
 47 = "org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration$DefaultErrorViewResolverConfiguration"
 48 = "conventionErrorViewResolver"
 49 = "org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration"
 50 = "errorAttributes"
 51 = "basicErrorController"
 52 = "errorPageCustomizer"
 53 = "preserveErrorControllerTargetClassPostProcessor"
 54 = "spring.resources-org.springframework.boot.autoconfigu
### 回答1: Spring Boot 自动装配是 Spring Boot 框架的核心特性之一,它能够根据一定的约定和条件自动配置 Spring 应用程序的依赖关系。其主要原理如下: 1. 条件注解:Spring Boot 使用了大量的条件注解来限制自动装配的范围。在自动配置类上使用了`@Conditional`注解,它根据特定的条件在特定的情况下激活自动配置。例如,`@ConditionalOnClass`注解表示只有当特定的类存在于类路径中时,才会激活自动配置。 2. Spring Boot Starter:Spring Boot Starter 是一种约定的依赖关系集合,是为了简化应用程序的配置而设计的。它包含了一组特定功能的依赖关系,并且使用了自动装配配置这些依赖关系。例如,使用`spring-boot-starter-web`可以自动配置 Web 相关依赖。 3. 自动配置类:Spring Boot 为很多常用的第三方库提供了自动配置类,这样可以在使用这些库时省去手动配置的步骤。自动配置类使用注解来标需要自动装配的Bean,并提供了特定的默认值。例如,使用`@EnableAutoConfiguration`注解可以启用自动配置。 4. 自动扫描:Spring Boot 使用了自动扫描机制来发现并注册自动配置类。通过在应用程序的入口类上使用`@SpringBootApplication`注解,可以开启自动扫描,并指定需要扫描的包。Spring Boot 会自动扫描指定包及其子包,找到所有的自动配置类并注册为Bean。 总体来说,Spring Boot 自动装配的原理就是使用了条件注解、Starter、自动配置类和自动扫描等机制来根据一定的规则自动配置应用程序的依赖关系。这种自动装配的方式大大简化了应用程序的配置过程,提高了开发效率。 ### 回答2: Spring Boot 是一个基于Spring框架的快速开发框架,它提供了自动装配功能,使得开发者不需要手动配置即可快速构建一个可运行的应用程序。 Spring Boot 的自动装配原理是基于Spring框架中的注解和自动装配机制。首先,开发者需要在Spring Boot的启动类上添加`@SpringBootApplication`注解,这个注解包含了`@Configuration`、`@EnableAutoConfiguration`和`@ComponentScan`三个注解。 `@Configuration`注解告诉Spring Boot这是一个配置类,其中包含了Bean的定义。初始阶段,Spring Boot会根据类路径下的各种条件自动选择和配置需要的Bean。 `@EnableAutoConfiguration`注解告诉Spring Boot开启自动装配功能。在这个过程中,Spring Boot会根据类路径和配置文件中的各种条件,自动添加和配置需要的Bean。它会根据类路径下的各种starter依赖,如`spring-boot-starter-web`、`spring-boot-starter-data-jpa`等来确定需要自动装配功能。 `@ComponentScan`注解告诉Spring Boot扫描并装配带有`@Component`、`@Service`、`@Repository`和`@Controller`等注解的类作为Bean。通过扫描这些注解,Spring Boot能够自动识别和装配这些Bean。 总结起来,Spring Boot的自动装配原理是通过扫描类路径和配置文件中的各种条件,自动选择和配置需要的Bean。它能够根据依赖的starter来选择需要自动装配功能,在开发过程中大大简化了配置和搭建环境的工作量,提高了开发效率。 ### 回答3: Spring Boot的自动装配原理是基于Spring框架的自动装配机制来实现的。自动装配是指根据约定俗成的规则,自动将符合条件的Bean组件注册到Spring容器中,而无需手动配置。 Spring Boot的自动装配原理主要有以下几个步骤: 1. 借助于启动器依赖:Spring Boot的项目中通常会使用启动器依赖来简化依赖管理。启动器依赖是一种便捷的方式,它会自动引入一组关联的依赖,并提供默认的配置。 2. 条件注解:Spring Boot中使用了很多条件注解,例如@ConditionalOnClass、@ConditionalOnBean等。这些注解用来根据条件判断是否需要装配某个Bean组件。 3. 自动配置类:Spring Boot通过自动配置实现自动装配。自动配置类使用了@Configuration注解,表示它是一个配置类,通过@Bean注解注册Bean组件。 4. META-INF/spring.factories文件:在Spring Boot的自动配置中,会使用META-INF/spring.factories文件来声明自动配置的类。该文件是一个属性文件,指定了Spring Boot自动配置类的全路径。 5. 启动类的@EnableAutoConfiguration注解:在Spring Boot的启动类上,通常会有@EnableAutoConfiguration注解。该注解会启用Spring Boot的自动配置机制,自动引入所需的配置类,并注册Bean组件。 Spring Boot的自动装配原理类似于Spring的基于注解的配置方式,但比起传统的Spring框架更加简化,减少了繁琐的配置步骤。通过自动装配,我们可以直接使用Spring Boot提供的默认配置,省去了很多手动配置的工作。同时,Spring Boot还提供了多种扩展方式,可以覆盖或修改默认配置,以满足项目的特殊需求。总之,Spring Boot的自动装配原理是通过条件注解、自动配置类和启动器依赖来实现的,它的设计目标是简化Spring应用的开发和部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值