SpringBoot自动装配解析

入口注解SpringBootApplication

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//继承自Configuration注解
@SpringBootConfiguration
// 启用 SpringBoot 的自动配置机制
@EnableAutoConfiguration
//扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描启动类所在的包下所有的类 ,可以自定义不扫描某些 bean。
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
....
}

@EnableAutoConfiguration实际处理:AutoConfigurationImportSelector

//实现ImportSelector中的方法,获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中。
//实际断点调试发现此方法未执行,因为AutoConfigurationImportSelector实现了DeferredImportSelector中的Group接口,并重写了getImportGroup,那么容器在启动的时候就不会执行selectImports方法了,而是执行getImportGroup方法。进而执行Group中重写的方法。
	@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());
	}
//获取所有需要装配的bean
	protected AutoConfigurationEntry getAutoConfigurationEntry(
			AutoConfigurationMetadata autoConfigurationMetadata,
			AnnotationMetadata annotationMetadata) {
//判断自动装配是否打开
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
//用于获取EnableAutoConfiguration注解中的 exclude 和 excludeName。
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
// 读取META-INF/spring.factories,获取需要自动装配的所有配置类(XXXAutoConfiguration类),所有starter下的配置均会加载
		List<String> configurations = getCandidateConfigurations(annotationMetadata,
				attributes);
// 根据各种条件筛选
//简单去重
		configurations = removeDuplicates(configurations);
//根据配置注解排除
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		configurations.removeAll(exclusions);
//根据ConditionOnXXX条件筛选
		configurations = filter(configurations, autoConfigurationMetadata);
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}

参考

https://cloud.tencent.com/developer/article/1979924
https://blog.csdn.net/qq_38345773/article/details/132653461

posted @   hwh405  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示