網(wǎng)站首頁 編程語言 正文
????????Spring Boot是由Pivotal團隊提供的框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發(fā)過程。該框架使用了特定的方式來進行配置,(自動裝配)使我們在開發(fā)中不再需要定義樣板化的配置(xml文件)。
? ? ? ? spring boot框架的核心注解:
@Configuration ?用于聲明定義bean,定義為配置類。作用在類上面。這也是springboot自動裝配關(guān)鍵的注解之一 其實就是平常Spring配置文件中我們寫的bean?
@EnableAutoConfiguration 用來開啟springboot自動配置的注解,這個也是自動裝配中很重要的注解
@ConfigurationProperties ?用來讀取配置文件并封裝成實體類
@EnableConfigurationProperties 這個一般要配合@ConfigurationProperties使用可以使??@ConfigurationProperties封裝成的實體類成功注入
我們單看spring boot的啟動類只能看到一個注解@SpringBootApplication,什么也看不到,所以要進注解中詳細分析。
?
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//用于定于Bean,springboot的啟動類其實也就是作為spring的一個bean注入到spring容器中。
@SpringBootConfiguration
//開啟自動裝配的核心注解
@EnableAutoConfiguration
//主要就是定義掃描的路徑從中找出標識了需要裝配的類自動裝配到spring的bean容器中
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
....
}
?
@EnableAutoConfiguration
@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 添加該注解的類所在的package 作為 自動配置package 進行管理,我查詢了一下,叫自動裝配包
@java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE})
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@java.lang.annotation.Documented
@java.lang.annotation.Inherited
@org.springframework.context.annotation.Import({
org.springframework.boot.autoconfigure.AutoConfigurationPackages.Registrar.class})
public @interface AutoConfigurationPackage {
java.lang.String[] basePackages() default {};
java.lang.Class<?>[] basePackageClasses() default {};
}
上一個注解我們把所有組件都加載到了容器里面,這個注解就是將需要自動裝配的類以全類名的方式返回,從而@Import({AutoConfigurationImportSelector.class})是將Bean注入spring容器 ?而這個導入的類的作用可以幫助將所有符合條件的@Configuration配置交給spring的IOC容器進行注入。
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
register(registry, new PackageImport(metadata).getPackageName());
}
那是怎么找到哪些是需要自動裝配的類呢?
AutoConfigurationImportSelector這個類里面有一個方法selectImports(),如下
@Override
public string[] selectImports(AnnotationMetadata annotationMetadata) {
if (!isEnabled(annotationMetadata)){
return No_IMPORTS;
}
AutoConfiqurationEntry autoConfiqurationEntry getAutoConfiqurationEntry(annotationMetadata)
return stringUtils.toStringArray(autoConfiqurationEntry.getconfiqurations();
}
在getCandidateConfigurations()方法里面調(diào)用了-->loadFactoryNames()方法,再調(diào)用-->loadSpringFactories()方法
public static List<string> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader)
String factoryTypeName =factoryType.getName();
return loadSpringFactories(classLoader)
getorDefault(factoryTypeName,Collections.emptyList());
}
關(guān)鍵就在這個loadSpringFactories()方法里面,在這個方法里,它會查找所有在META-INF路徑下的spring.factories文件-->在META-INF/spring.factories這個文件里面的數(shù)據(jù)是以鍵=值的方式存儲,然后解析這些文件,找出以EnableAutoConfiguration為鍵的所有值,以列表的方式返回。
大致流程如下:
@SpringBootApplication等同于下面三個注解(作用點):
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
其中@EnableAutoConfiguration是關(guān)鍵(啟用自動配置),內(nèi)部實際上就去加載META-INF/spring.factories文件的信息,然后篩選出以EnableAutoConfiguration為key的數(shù)據(jù),加載到IOC容器中,實現(xiàn)自動配置功能。
原文鏈接:https://blog.csdn.net/l1050188952/article/details/126339271
相關(guān)推薦
- 2022-08-18 C語言系統(tǒng)日期和時間實例詳解_C 語言
- 2022-04-03 基于QT5實現(xiàn)一個時鐘桌面_C 語言
- 2022-07-30 jQuery?UI菜單部件Menu?Widget_jquery
- 2023-01-03 Redis通用命令介紹以及key的層級結(jié)構(gòu)講解_Redis
- 2022-01-16 jQuery 核心函數(shù)css和平滑滾動頂部
- 2022-06-15 C#實現(xiàn)希爾排序_C#教程
- 2022-11-25 Python執(zhí)行dos和Linux命令的方法詳解_python
- 2022-04-12 C語言打印楊輝三角形的示例代碼_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支