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

@EnableAutoConfiguration
- @AutoConfigurationPackage : 自動(dòng)配置包注解,默認(rèn)將主配置類(@SpringBootApplication)所在的包及其子包里面的所有組件掃描到IOC容器中。
- @Import : 引入相應(yīng)的自動(dòng)裝配類,這里是導(dǎo)入了AutoConfigurationImportSelector類,從 所有的spring.factories 文件注入自動(dòng)配置類到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屬性的屬性值,并且對(duì)于的包名放入packageNames列表中
for(int var6 = 0; var6 < var5; ++var6) {
Class<?> basePackageClass = var4[var6];
packageNames.add(basePackageClass.getPackage().getName());
}
if (packageNames.isEmpty()) {
// 如果packageNames為空,就將AutoConfigurationPackage注解標(biāo)注的類所在的包名作為packageNames
packageNames.add(ClassUtils.getPackageName(metadata.getClassName()));
}
this.packageNames = Collections.unmodifiableList(packageNames);
}
@Import(AutoConfigurationImportSelector.class)
直接給到最終代碼邏輯 getAutoConfigurationEntry 方法
// 判斷是否開啟自動(dòng)配置
if (!this.isEnabled(annotationMetadata)) {
return EMPTY_ENTRY;
} else {
// 獲取注解屬性
AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
// 從 spring.factories 文件中獲取自動(dòng)配置類
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
// 去掉重復(fù)的自動(dòng)配置類
configurations = this.removeDuplicates(configurations);
// 根據(jù)注解配置 排除自動(dòng)配置類
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é)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
javaweb實(shí)戰(zhàn)之商城項(xiàng)目開發(fā)(三)
這篇文章主要針對(duì)javaweb商城項(xiàng)目開發(fā)進(jìn)行實(shí)戰(zhàn)演習(xí),主要實(shí)現(xiàn)通用的BaseDao.java和使用resultMap映射關(guān)聯(lián)對(duì)象,感興趣的小伙伴們可以參考一下2016-02-02
Java數(shù)據(jù)結(jié)構(gòu)之二叉搜索樹詳解
二叉搜索樹作為一個(gè)經(jīng)典的數(shù)據(jù)結(jié)構(gòu),具有鏈表的快速插入與刪除的特點(diǎn),同時(shí)查詢效率也很優(yōu)秀,所以應(yīng)用十分廣泛。本文將詳細(xì)講講二叉搜索樹的原理與實(shí)現(xiàn),需要的可以參考一下2022-06-06
knife4j3.0.3整合gateway和注冊(cè)中心的詳細(xì)過程
這篇文章主要介紹了knife4j3.0.3整合gateway和注冊(cè)中心的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03

