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