使用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)文章
SSH框架網(wǎng)上商城項(xiàng)目第13戰(zhàn)之Struts2文件上傳功能
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第13戰(zhàn)之Struts2文件上傳功能的相關(guān)資料,感興趣的小伙伴們可以參考一下2016-06-06詳解Spring?中?Bean?對(duì)象的存儲(chǔ)和取出
由于?Spring?擁有對(duì)象的管理權(quán),所以我們也需要擁有較為高效的對(duì)象存儲(chǔ)和取出的手段,下面我們來分別總結(jié)一下,對(duì)Spring?中?Bean?對(duì)象的存儲(chǔ)和取出知識(shí)感興趣的朋友跟隨小編一起看看吧2022-11-11Spring Bean如何實(shí)現(xiàn)自動(dòng)配置代碼實(shí)例
這篇文章主要介紹了Spring Bean如何實(shí)現(xiàn)自動(dòng)配置代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09Spring事務(wù)Transaction配置的五種注入方式詳解
這篇文章主要介紹了Spring事務(wù)Transaction配置的五種注入方式詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-04-04SpringBoot3.0集成MybatisPlus的實(shí)現(xiàn)方法
本文主要介紹了SpringBoot3.0集成MybatisPlus的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-08-08Mybatis-Plus設(shè)置全局或者局部ID自增的實(shí)現(xiàn)
在使用Mybatis-Plus新增的時(shí)候,我們往往想要id隨著數(shù)據(jù)庫自增,本文主要介紹了Mybatis-Plus設(shè)置全局或者局部ID自增的實(shí)現(xiàn),具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01springboot與redis的簡(jiǎn)單整合實(shí)例
Redis是一個(gè)緩存、消息代理和功能豐富的鍵值存儲(chǔ)。StringBoot提供了基本的自動(dòng)配置。這篇文章主要介紹了springboot與redis的簡(jiǎn)單整合實(shí)例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2019-01-01