SpringBoot启动过程深度解析——自动装配-启动过程解析
发布日期:2023-09-20 01:41:38 浏览次数:1 分类:技术文章

本文共 2647 字,大约阅读时间需要 8 分钟。

SpringBoot启动过程深度解析——自动装配-启动过程解析


一、自动装配相关概念

自动装配是什么?	自动装配是用户在Spring进行简单的配置,就能让Spring在启动过程中对相关Bean进行自动装配,然后将它们交给spring容器来帮我们进行管理。自动装配功能的包:	Spring-boot-autoconfigure包提供了自动装配的功能如何开启自动装配的注解以及如何实现自动装配:	如何开启:		在启动类加上@EnableAutoConfiguration来开启自动装配功能			@EnableAutoConfiguration是如何实现自动装配的:		此注解包含两个重要的注解,是通过以下的子注解实现自动装配:			@AutoConfigurationPackage:					这个注解的作用说白了就是将主配置类(@SpringBootApplication标注的类)所在包以及子包里面的所有组件扫描并加载到spring的容器中			@Import(AutoConfigurationImportSelector.class)					这个注解就是引入AutoConfigurationImportSelector类,通过该类检索META-INF/spring.factories文件中EnableAutoConfiguration所有实现类,对这些实现类进行个性化的自动装配					【并非所有EnableAutoConfiguration所有实现类都会生效,而是根据实现类中各种@Condition进行条件筛选来决定要不要装配】

二、自动装配的流程

开启自动装配:	1.引入Spring-boot-autoconfigure包	2.在启动类加上@EnableAutoConfiguration来开启自动装配功能	Spring启动过程中如何扫描需要装配的Bean:	1.spring启动过程中的invokeBeanFactoryPostProcessors()方法,会调用BeanDefinitionRegisterPostProcessr的实现类,实现BeanDefnition的注册和修改	2.【ConfigurationClassPostProcessor类是BeanDefinitionRegisterPostProcessr的实现类之一,实现了对整个项目的Bean发现和BeanDefiniton的注册】	3.ConfigurationClassPostProcessor类的方法,包含对以下注解的解析@Configuration、@Component、@PropertySource、@ComponentScan、@Bean、@Import	4.由于启动类使用了注解@EnableAutoConfiguration【@AutoConfigurationPackage 和 @Import(AutoConfigurationImportSelector.class)】,所以ConfigurationClassPostProcessor类就会对这两个注解进行解析和执行特定的自动装配	5.首先是@AutoConfigurationPackage,会对主配置类所在包以及子包里面的所有组件扫描并加载到spring的容器中	6.其次是@Import(AutoConfigurationImportSelector.class),通过引入AutoConfigurationImportSelector类,并通过该类检索META-INF/spring.factories文件中EnableAutoConfiguration所有实现类,让后用这些实现类重新执行自动装配的流程	7.最终实现了自动装配 自定义的一些Bean信息到Spring容器中,并执行创建Bean的统一流程

三、自动装配过程中一些注解

如果想在特定的环境/条件下,执行自动装配的配置类的解析,就需要用到以下这些条件注解,帮助我们更加灵活地使用自动装配功能

自动配置中使用的条件化注解 ===============================================================================================================条件化注解 						    配置生效条件 ===============================================================================================================@ConditionalOnBean 					配置了某个特定Bean @ConditionalOnMissingBean 			没有配置特定的Bean @ConditionalOnClass 				Classpath里有指定的类 @ConditionalOnMissingClass 			Classpath里缺少指定的类 @ConditionalOnExpression 			给定的Spring Expression Language(SpEL)表达式计算结果为true @ConditionalOnJava 					Java的版本匹配特定值或者一个范围值 @ConditionalOnJndi 					参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext @ConditionalOnProperty 				指定的配置属性要有一个明确的值 @ConditionalOnResource 				Classpath里有指定的资源 @ConditionalOnWebApplication 		这是一个Web应用程序 @ConditionalOnNotWebApplication 	这不是一个Web应用程序 ===============================================================================================================此处说明:该段文本的原文链接:https://blog.csdn.net/qq_57434877/article/details/123933529

转载地址:https://blog.csdn.net/weixin_39072857/article/details/130120565 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:SpringBoot和mybatis-plus整合
下一篇:SpringBoot启动过程深度解析——概述

发表评论

最新留言

关注你微信了!
[***.104.42.241]2023年09月24日 20时29分40秒