使用springboot自動配置源碼解讀
更新時間:2024年11月07日 15:24:51 作者:阿勝yss
自動裝配是Spring Boot的一個核心特性,允許程序員在開發(fā)中更加專注于業(yè)務邏輯,而不是花費大量的時間去配置和管理第三方組件,當開發(fā)者在pom.xml文件中添加了某個依賴后,Spring Boot通過自動配置的方式,將這些第三方組件的實例自動注入到IOC容器中
什么是自動裝配
當我們程序依賴第三方功能組件時,不需要手動將這些組件類加載到IOC容器中。
例如 當程序需要用到redis時,在pom.xml文件中引入依賴,然后使用依賴注入的方式直接從IOC容器中拿到相應RedisTemplate實例。
@SpringBootApplication 作用
- @SpringBootConfiguration:主啟動類可以當做配置類使用,比如注入Bean等。
- @ComponentScan:包掃描注解。
- @EnableAutoConfiguration(重要):開啟自動配置。

@EnableAutoConfiguration
- @AutoConfigurationPackage : 自動配置包注解,默認將主配置類(@SpringBootApplication)所在的包及其子包里面的所有組件掃描到IOC容器中。
- @Import : 引入相應的自動裝配類,這里是導入了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);
// 去掉重復的自動配置類
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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Java數(shù)據(jù)結(jié)構之二叉搜索樹詳解
二叉搜索樹作為一個經(jīng)典的數(shù)據(jù)結(jié)構,具有鏈表的快速插入與刪除的特點,同時查詢效率也很優(yōu)秀,所以應用十分廣泛。本文將詳細講講二叉搜索樹的原理與實現(xiàn),需要的可以參考一下2022-06-06
knife4j3.0.3整合gateway和注冊中心的詳細過程
這篇文章主要介紹了knife4j3.0.3整合gateway和注冊中心的詳細過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03

