首页 > 其他分享 >springboot自动配置

springboot自动配置

时间:2024-03-14 23:00:13浏览次数:25  
标签:springboot spring 配置 jar bean 自动 注解

首先,你在pom文件里引入的很多第三方jar里都有一个文件 META-INF/spring.factories,这个文件里的内容和关系到能否自动配置, 那有的jar为啥没有,是不需要SpringBoot来自动配置吗,这个我们后面再说。

 

 

 

 

先来看一下redisson starter的/ META-INF/spring.factories是怎么写的, 如下图,只有一行,是key=value的格式

 

 这个key是一个spring的注解,value是一个redission的jar包里的一个配置类, 如下图

 

根据注解的名字,大胆猜测一下,这个配置类是需要被自动配置的

事实上就是这样的,SpringBoot会扫描所有classpath下的所有jar里面的spring.factories文件,然后生成一个大概就是Map<String, List<String>>形式的一个键值对,value会和相同key的value组成一个List。

那就可以根据key是EnableAutoConfiguration,得到所有需要自动配置的配置类的信息了,到时候只需要把每个配置类配置一下就行了

 

具体怎么做的呢?

 

首先我们SpringBoot项目默认都是有Application类,上面还有个注解@SpringBootApplication,这是个组合注解,是由好多个别的注解组合而成,因为我们是想研究自动配置,那我们着重关注

@SpringBootConfiguration    这个注解代表这个是源配置文件
@EnableAutoConfiguration   这个代表Spring能进行自动配置,既是一个开关,也是指引Spring怎么去找到并进行自动配置, 它本身也是个组合注解,点开来看又用@import注解引入了一个class
@ComponentScan                这个会告诉Spring扫描哪些package下的类,这里默认会扫描Application所在的package下

 

打开AutoConfigurationImportSelector.class看, 它实现了接口 DeferredImportSelector,DeferredImportSelector接口又是继承自ImportSelector,

DeferredImportSelector翻译一下就是 推迟的引入选择器,从名字上来看,它会帮助Spring引入bean或者配置,而且是推迟的

这是因为Spring会先配置好我们代码中的(即和Application类相同package下的)配置类,然后把我们写的一些bean交给IoC来管理,然后才是引入依赖的配置类,并把依赖里面的bean给实例化并交给IoC。

为啥要这么先处理自己代码包下的配置类和bean?网上找了一下答案,说是方便我们扩展和覆盖。好像没毛病,肯定是依赖里面帮你配置好了bean,如果你自己不配置的话,就直接用依赖包里写好的,但是你如果自己写了,依赖包里配置好的bean就不使用了。符合SpringBoot的约定优于配置。

 

 比如我们如果引入了redisson的starter并在application.properties里面配置一下连接参数,就能在Service中或者Component中使用@Resource或者@Autowired来注入RedissonClient这个bean了,这个bean是怎么会被IoC容器实例化并存在容器中的呢?

 我们再次打开redisson--spring-boot-starter的spring.factories和它里面指定的RedissonAutoConfiguration这个配置类来看一下,如下图

 

 

通过SpringBoot的自动配置,先把RedissonAutoConfiguration这个配置类通过spring.factories暴露给Spring,然后Spring根据这个配置类,调用了下面很多个@Bean注解的方法,把这些实例给加到IoC容器中。

@ConditionalOnMissionBean(RedissonClient.class)的意思就是如果我们自己的代码中没有引入这个bean,那就会帮我们把RedissonClient给实例化并交给IoC,

假如我们自己想要自己实例化一个特殊的RedissonClient或者在实例化前做点操作,那我们可以自己写一下,如下图,这样也就是实现了上面提到的 方便我们扩展和覆盖

 

 

回到上面的一个问题,为什么有的starter里面没有spring.factories呢?那它是怎么实现自动配置的。

是因为有个我们把我们的项目的parent设置成了spring-boot-starter-parent,springboot自动帮我们依赖了spring-boot-autoconfigure.jar

 这里面有两个重要的文件,一个是配置了当前SpringBoot版本常用的依赖的配置类,一个是配置类的一些加载条件,你看我在里面找到了啥,是spring-boot-starter-data-redis里面的配置类,之所以starter的jar里面没有spring.factories文件,原来是在这里统一配置了。

 

 

 

最后我们再来看一下调用的大概过程

从@SpringBootApplication =》 @EnableAutoConfiguration =》 @Import({AutoConfigurationImportSelector.class}),看一下这个class的一个重要方法getAutoConfigurationEntry

 

 这个方法就是放回所有的配置类,先通过SpringFactoriesLoader去获取依赖的jar里的配置类,然后获取了从autoconfigure这个jar的AutoCOnfiguration.imports文件里找到的所有配置类,加在一起作为候选名单,经过去重,filter(根据spring-autoconfiguration-metadata.properties里的条件)等操作,返回出去需要自动配置的一些配置类。

 

然后在引入这些配置类的时候,根据@Conditional***的注解,按要求把需要的bean都给实例化加到IoC容器。

 

 

 

自动配置大概就是这样。

 

 

提一下条件配置,随便裂了几个常见的

ConditionalOnMissingBean    如果后面指定的这个bean还没有加入到IoC容器的话,就把这个注解标注的方法执行一下
ConditionalOnMissingClass   同上,只不过变成了class,猜测应该是有没有类加载器加载了这个class
ConditionalOnBean                某个bean已经被加入IoC了,才能执行这个方法
ConditionalOnClass                某个class已经被类加载了,才能执行这个方法

 

SPI和spring.factories其实比较像,都是约定了一个文件位置,然后读这个文件来实现自动扩展,动态加载一些内容。有兴趣的自己查一下。

 


 

标签:springboot,spring,配置,jar,bean,自动,注解
From: https://www.cnblogs.com/huainanyin/p/18073942

相关文章

  • Python:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码
    Python:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码引言:功能概述步骤一:提取PDF标题步骤二:生成目录和页码,合并PDF技术亮点代码步骤一:提取PDF标题(Step_two.ipynb)步骤二:生成目录和页码,合并PDF(Step_two.ipynb)引言:在学术研究、文档管理等领域,经常需......
  • 在Docker上传我们自己的镜像(以springboot项目为例)
    首先确定好在我们的centOS服务器上已经安装并配置好docker配置自己的springboot镜像并运行获取springboot的jar包mavenclean--》mavenuepackage --》复制target目录下生成的jar包在服务器选择一个文件夹上传jar包,我这里选用的文件夹叫做/opt/dockertest在jar包的同一......
  • springboot3+vue3(十一)springboot多环境开发
    在开发中我们往往会遇到,本地环境、测试环境、生产环境分别一套配置。如数据库连接,端口号等配置各不相同的问题。 1、多文件配置    2、多文件分组配置如果配置文件有很多的配置信息几百行的情况,为了方便维护我们可以根据功能的情况进行分组拆分。如:服务器相关配......
  • CCLINK转Profinet网关功能介绍及配置方法
    CC-LINK转Profinet网关功能介绍及配置方法CC-LINK转Profinet网关(XD-PNCR20)支持CC-Link系统,采用一种开放式架构的工业现场总线协议,允许不同厂商的设备依此协议进行通信。由于其良好的兼容性,CC-Link广泛使用在在制造产业中的机器控制或程序控制中,也使用在设备管理及智能建筑系统中,包......
  • Pyecharts可视化配置
    导入Pyechartsimportpyecharts基本图表Bar(柱状图/条形图)Bar3D(3D柱状图)Boxplot(箱形图)EffectScatter(带有涟漪特效动画的散点图)Funnel(漏斗图)Gauge(仪表盘)Geo(地理坐标系)GeoLines(地理坐标系线图)Graph(关系图)HeatMap(热力图)Kline/Candlestick(K线图)Line(折线/面积图)Line3D(3D折......
  • STM32入门(三):配置STM32项目环境
    配置STM32项目环境1. 选择合适的开发板首先我们需要选择一块合适简单的开发板,学习的板子选择stm32—f103系列板子。这一系列器件具有以下优势:性能:STM32F103F系列提供了一个强大的32位ARMCortex-M3内核,具有足够的处理能力来处理大多数嵌入式应用。外设丰富:这些芯片提供......
  • springboot3/14
    在做系统首页配置时,#注意点,所有页面的静态资源都需要使用thymeleaf去接管;@{}页面国际化在项目中使用国际化我们需要配置i18n文件如果需要在项目中进行按钮自动切换功能,需要自己去定义一个国际化组件LocaleResolver配置完成后,记得将写好的组件配置到spring容器中@Bean在网页......
  • C/C++ vscode 配置
    一、由于vscode本身不带有编译器,需要下载MinGW编译器 打开网站:MinGW-w64-for32and64bitWindows-Browse/mingw-w64/mingw-w64-releaseatSourceForge.net下载x86_64-win32-seh版本下载后,解压缩,把解压缩后的文件剪切奥C:\ProgramFiles把路径C:\ProgramFiles......
  • 真炸裂,发现一款基于springboot超级好用的开源服务器框架
    兄弟们,真不骗你们,这个框架用起来是真的爽,简直是服务器开发人员的福音!集成该项目后,不用我们程序员再去处理api安全、加签、验签、参数校验、加解密、数据脱敏、异常处理、国际化、接口文档、错误码、缓存、分布式锁、应用、渠道管理等等功能。而且为了帮助客户端开发的同学更简......
  • SpringBoot - [02] 第一个SpringBoot程序
     一、引入依赖<!--web依赖:tomcat,dispatcherServlet,xml--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--spring-boot-starter所有的s......