学习笔记---springboot的自动装配实现的简单分析

个人粗浅认为,springboot在功能上基本是实现三个:
1.解决spring的大量xml等配置,利用的是:spring的注解扩张+spi 机制+javaConfig,也就是实现自动装配,用户也可以在此功能上开发自己的配置类Starter; 2.实现servlet3.0 规范; 3.内置servlet容器功能;

先来分析笔记的自动装配:如上面总结所说,是利用原生的spring的注解以及spi来实现的,说的精细点,就是在原来的spring 的IOC 功能+新开发特定的的spi机制+javaConfig 方式来开发的;那么在这里温习下spring的IOC;所谓的IOC,个人觉得就是一大堆组件的实现控制bean的生命周期的容器集合体,并用单例缓存池来存储实例初始化的完整对象,这些组件包括:Bean的定义类BeanDefinition,BeanDefinitionMap,扩张接口:BeanFactoryPostProcessor,BeanPostProcessor,FactoryBean,InitializingBean,DestoryBean 以及各种感知接口;
首先看下启动类注解:
在这里插入图片描述
在这里插入图片描述
看到这个重点:@Import(AutoConfigurationImportSelector.class) 这个就牵扯到 spring 的功能了,用法:注解Import 有三种用法:
在这里插入图片描述

  1. 普通bean 2.实现DeferredImportSelector接口的类 3.实现ImportSelector接口的类 4.实现ImportBeanDefinitionRegistrar的类
    这里大概说一下:spring 在启动时必定会进入:
    在这里插入图片描述
    这一步就是处理加载bean的定义的,个人认为是利用:PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors --》
    ConfigurationClassParser.processConfigurationClass --》ConfigurationClassParser.doProcessConfigurationClass 来递归扫描配置包下的:Component注解, PropertySource注解,ComponentScan注解,Import注解,ImportResource注解,Bean注解。。。等加载的注解,并且调用 ImportBeanDefinitionRegistrar ,BeanFactoryPostProcessor 的相关实现类去加载对应bean的信息,这就是ioc的加载类定义的关键一步;后面会记录这部分的笔记;
    springboot的 @Import(AutoConfigurationImportSelector.class) 就是利用实现了 DeferredImportSelector
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,
		ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {
-----------------------------------------------省略
	@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return NO_IMPORTS;
		}
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(autoConfigurationMetadata,
				annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}
	protected AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata,
			AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
		configurations = removeDuplicates(configurations);
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
		configurations = filter(configurations, autoConfigurationMetadata);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}
	-----------------------------------------------省略

在这里插入图片描述这里加载自动装配的所有的全限定类名;进去:
在这里插入图片描述
在这里插入图片描述
这个非常关键,记住这个:org.springframework.boot.autoconfigure.EnableAutoConfiguration
在这里插入图片描述在这里会进去到断点,主要注意的是:
public static final String FACTORIES_RESOURCE_LOCATION = “META-INF/spring.factories”;
PropertiesLoaderUtils.loadProperties(resource) 是去该路径下解析加载这个文件的内容:

这样就可以获取到这个路径下的全限定类名了,返回:
在这里插入图片描述
回到:
在这里插入图片描述
结合就是过滤去重等操作,返回相关的类即可,回到:
在这里插入图片描述
这里就是spring的IOC的功能了,至此,springboot 的自动加载就此结束;所以个人认为:自动装配,就是自动加载特定路径下配置的类的 全限定类名;另外来看下配置类的实现:以;org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration
为例:
在这里插入图片描述以Condition为开头的就是满足一定该条件执行,总结:就是在原来的spring 的IOC 功能+新开发特定的的spi机制+javaConfig 方式实现类的定义的加载交于spring容器,至于创建就是原本spring ioc的功能;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,可以得出以下结论: Spring Boot的自动装配原理可以通过查看spring.factories文件来了解。该文件位于spring-boot-autoconfigure-2.5.4.jar包的META-INF目录下。在启动过程中,Spring Boot会根据spring.factories文件中配置的自动配置类的全类名来加载对应的配置类。如果配置类中的@ConditionalOnxxx注解满足条件,则会加载该配置类。\[1\] 如果想深入了解自动装配的原理,可以在源码中进行跟踪和研究。了解自动装配后,可以更好地理解yaml配置的过程,并在源码中找到可以配置的属性。\[3\] 在学习Spring Boot之前,建议先具备Spring和Spring MVC的基础知识。Spring Boot的目的是简化新Spring应用的搭建和开发过程,它使用特定的配置方式,使开发人员不再需要定义样板化的配置。\[4\] 对于集成特定模块,比如Freemarker,Spring Boot提供了自动集成的功能。只需要导入相应的starter包,就会自动实现注入。例如,集成Freemarker可以通过导入FreeMarkerAutoConfiguration来实现。\[5\] 综上所述,Spring Boot的自动装配原理可以通过查看spring.factories文件来了解,同时可以在源码中进行深入研究。在学习之前,建议具备Spring和Spring MVC的基础知识。对于特定模块的集成,Spring Boot提供了自动集成的功能。 #### 引用[.reference_title] - *1* [springboot自动装配原理笔记一](https://blog.csdn.net/JieZhongBa/article/details/120378592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *4* *5* [导图梳理springboot手动、自动装配,让springboot不再难懂](https://blog.csdn.net/b644ROfP20z37485O35M/article/details/102029574)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [SpringBoot思维导图(知识点总结)](https://blog.csdn.net/weixin_38378034/article/details/115432455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值