使用springboot自動配置源碼解讀
什么是自動裝配
當我們程序依賴第三方功能組件時,不需要手動將這些組件類加載到IOC容器中。
例如 當程序需要用到redis時,在pom.xml文件中引入依賴,然后使用依賴注入的方式直接從IOC容器中拿到相應(yīng)RedisTemplate實例。
@SpringBootApplication 作用
- @SpringBootConfiguration:主啟動類可以當做配置類使用,比如注入Bean等。
- @ComponentScan:包掃描注解。
- @EnableAutoConfiguration(重要):開啟自動配置。

@EnableAutoConfiguration
- @AutoConfigurationPackage : 自動配置包注解,默認將主配置類(@SpringBootApplication)所在的包及其子包里面的所有組件掃描到IOC容器中。
- @Import : 引入相應(yīng)的自動裝配類,這里是導(dǎo)入了AutoConfigurationImportSelector類,從 所有的spring.factories 文件注入自動配置類到IOC容器。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
源碼解讀
@AutoConfigurationPackage
@Import 引入 Registrar配置類
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
}
PackageImports(AnnotationMetadata metadata) {
// 獲取包名
AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false));
List<String> packageNames = new ArrayList(Arrays.asList(attributes.getStringArray("basePackages")));
Class[] var4 = attributes.getClassArray("basePackageClasses");
int var5 = var4.length;
// 獲取basePackageClasses屬性的屬性值,并且對于的包名放入packageNames列表中
for(int var6 = 0; var6 < var5; ++var6) {
Class<?> basePackageClass = var4[var6];
packageNames.add(basePackageClass.getPackage().getName());
}
if (packageNames.isEmpty()) {
// 如果packageNames為空,就將AutoConfigurationPackage注解標注的類所在的包名作為packageNames
packageNames.add(ClassUtils.getPackageName(metadata.getClassName()));
}
this.packageNames = Collections.unmodifiableList(packageNames);
}
@Import(AutoConfigurationImportSelector.class)
直接給到最終代碼邏輯 getAutoConfigurationEntry 方法
// 判斷是否開啟自動配置
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
// 獲取注解屬性
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
// 從 spring.factories 文件中獲取自動配置類
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
// 去掉重復(fù)的自動配置類
configurations = this.removeDuplicates(configurations);
// 根據(jù)注解配置 排除自動配置類
Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);
return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SSH框架網(wǎng)上商城項目第13戰(zhàn)之Struts2文件上傳功能
這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第13戰(zhàn)之Struts2文件上傳功能的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06
Spring事務(wù)Transaction配置的五種注入方式詳解
這篇文章主要介紹了Spring事務(wù)Transaction配置的五種注入方式詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04
SpringBoot3.0集成MybatisPlus的實現(xiàn)方法
本文主要介紹了SpringBoot3.0集成MybatisPlus的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08
Mybatis-Plus設(shè)置全局或者局部ID自增的實現(xiàn)
在使用Mybatis-Plus新增的時候,我們往往想要id隨著數(shù)據(jù)庫自增,本文主要介紹了Mybatis-Plus設(shè)置全局或者局部ID自增的實現(xiàn),具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01

