使用springboot自動配置源碼解讀
什么是自動裝配
當(dāng)我們程序依賴第三方功能組件時,不需要手動將這些組件類加載到IOC容器中。
例如 當(dāng)程序需要用到redis時,在pom.xml文件中引入依賴,然后使用依賴注入的方式直接從IOC容器中拿到相應(yīng)RedisTemplate實例。
@SpringBootApplication 作用
- @SpringBootConfiguration:主啟動類可以當(dāng)做配置類使用,比如注入Bean等。
- @ComponentScan:包掃描注解。
- @EnableAutoConfiguration(重要):開啟自動配置。
@EnableAutoConfiguration
- @AutoConfigurationPackage : 自動配置包注解,默認(rèn)將主配置類(@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注解標(biāo)注的類所在的包名作為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文件上傳功能
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項目第13戰(zhàn)之Struts2文件上傳功能的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06Spring事務(wù)Transaction配置的五種注入方式詳解
這篇文章主要介紹了Spring事務(wù)Transaction配置的五種注入方式詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2017-04-04SpringBoot3.0集成MybatisPlus的實現(xiàn)方法
本文主要介紹了SpringBoot3.0集成MybatisPlus的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08Mybatis-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