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

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 LanguageSpEL)表达式计算结果为true 
@ConditionalOnJava 					Java的版本匹配特定值或者一个范围值 
@ConditionalOnJndi 					参数中给定的JNDI位置必须存在一个,如果没有给参数,则要有JNDI InitialContext 
@ConditionalOnProperty 				指定的配置属性要有一个明确的值 
@ConditionalOnResource 				Classpath里有指定的资源 
@ConditionalOnWebApplication 		这是一个Web应用程序 
@ConditionalOnNotWebApplication 	这不是一个Web应用程序 
===============================================================================================================
此处说明:该段文本的原文链接:https://blog.csdn.net/qq_57434877/article/details/123933529
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值