springboot自动配置原理浅析(代码片段)

霜序0.2℃ 霜序0.2℃     2023-01-11     195

关键词:

springboot自动配置原理 浅析

springboot版本2.5.5

注解@SpringBootApplication的源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = @Filter(
    type = FilterType.CUSTOM,
    classes = TypeExcludeFilter.class
), @Filter(
    type = FilterType.CUSTOM,
    classes = AutoConfigurationExcludeFilter.class
)
)
public @interface SpringBootApplication 

我们可以看到

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
ComponentScan

其中ComponentScan注解用于扫描,注解后面跟着的是springboot自定义的扫描器,这个最后我们再谈

SpringBootConfiguration

这个是SpringBootConfiguration的源码,我们可以看出

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration 

我们看到有Configuration注解,无非就是配置类,只不过SpringBootApplication是主配置类

EnableAutoConfiguration

源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration 

其中有着

@AutoConfigurationPackage
AutoConfigurationPackage

“自动配置包”

再看看源码:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(Registrar.class)
public @interface AutoConfigurationPackage 
    String[] basePackages() default ;

    Class<?>[] basePackageClasses() default ;

Import是什么,就是自动给容器导入组件

我们看看这个类的源码:(好吧,实属套娃了)

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports 
    Registrar() 
    

    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) 
        AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
    

    public Set<Object> determineImports(AnnotationMetadata metadata) 
        return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
    

作用是给容器里面批量注册组件

registerBeanDefinitions方法中的参数AnnotationMetadata注解变化信息,相当于源信息,所以我们找到标记这个合成注解的类(被SpringBootApplication标记了的类)

方法内部:

AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));

有一个(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0])

从意思大致可以看出是什么,获取源信息类自动配置包的包名,封装到数组里面(toArray(new String[0])),然后再注册进去,相当于把源信息类所在包下的所有组件自动配置进IOC容器

最后

@ComponentScan注解是一个组件包扫描器,用于将指定包中的注解类自动装配到Spring的Bea容器中。(带有特定注解的类)

@ComponentScan注解具体扫描的包的根路径由Spring Boot项目主程序类所在包位置决定,在扫描过程中,由@AutoConfigurationPackage注解进行解析,从而得到Spring Boot项目主程序启动类所在包的具体位置。

参考:

https://www.bilibili.com/video/BV19K4y1L7MT?p=13

https://www.cnblogs.com/my-program-life/p/12181488.html

springboot05:自动配置原理(代码片段)

SpringBoot05:自动配置原理自动配置原理配置文件到底能写什么?怎么写?SpringBoot官方文档中有大量的配置,我们无法全部记住分析自动配置原理我们以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;//表示这... 查看详情

springboot自动配置原理(代码片段)

...perties配置文件能配置的属性参照1、自动配置原理:1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAu 查看详情

springboot学习笔记——自动配置原理(代码片段)

前置知识:SpringBoot学习笔记——SpringBoot简介与HelloWordSpringBoot学习笔记——源码初步解析SpringBoot学习笔记——配置文件yaml学习SpringBoot学习笔记——JSR303数据校验与多环境切换自动配置原理配置文件到底能写什么?怎么写?Spring... 查看详情

springboot自动配置原理以及手动实现配置类(代码片段)

springboot自动配置原理以及手动实现配置类1、原理spring有一个思想是“约定大于配置”。配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot在启动的时候可以把一些配置类自动注入到spring的IOC容器里,项目运行... 查看详情

springboot2-*自动配置原理*(续)(代码片段)

自动配置原理Spring官方文档解释1、自动配置原理:1)、SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration2)、@EnableAutoConfiguration作用:利用EnableAutoConfigurationImportSelector给容器 查看详情

springboot的自动配置原理(代码片段)

一、入口上篇注解@SpringBootApplication简单分析,说到了@SpringBootApplication注解的内部结构,其中@EnableAutoConfiguration利用EnableAutoConfigurationImportSelector.selectImports()给容器list中导入spring-boot-autoconfigure包下的多个配置类,根据包下的ME 查看详情

springboot的自动配置原理(代码片段)

三个重要的注解在使用main()启动SpringBoot的时候,只有一个注解@SpringBootApplication我们点进去@SpringBootApplication注解可以发现有三个注解是比较重要的:@SpringBootConfiguration:我们点进去以后可以发现底层是Configuration注解,支... 查看详情

springboot自动配置原理(代码片段)

微信搜索:码农StayUp主页地址:https://gozhuyinglong.github.io源码分享:https://github.com/gozhuyinglong/blog-demosSpringBoot的自动配置可以根据添加的jar依赖,自动配置SpringBoot应用程序。例如,我们想要使用Redis, 查看详情

springboot嵌入式tomcat的自动配置原理(代码片段)

在读本篇文章之前如果你读过这篇文章SpringBoot自动装配原理解析应该会更加轻松准备工作我们知道SpringBoot的自动装配的秘密在org.springframework.boot.autoconfigure包下的spring.factories文件中,而嵌入Tomcat的原理就在这个文件中加载的一... 查看详情

springboot自动配置原理,你真的懂吗?(代码片段)

概述上面博文(SpringBoot简介与快速搭建)我们简单的介绍了什么是SpringBoot,以及如何使用SpringBoot,但是我们对于SpringBoot的基本原理并没有介绍,这篇博文我们重点介绍SpringBoot是如何实现的自动配置。依赖管... 查看详情

springboot——mvc自动配置原理(代码片段)

...ringMVC容器中实现一个视图解析器转换器和格式化器 修改SpringBoot的默认配置全面接管SpringMVCSpringBoot为SpringMVC提供了自动配置,适用于大多数应用程序。官方文档描述:自动配置在Spring的默认值之上添加了以下功能:... 查看详情

springboot自动配置原理及如何创建自己的starter(代码片段)

...自由转载出自:shusheng007文章目录概述约定优于配置SpringBoot如何实现自动装配原理具体实现配置文件关键代码如何写一个自己的SpringBootStarter创建自动配置项目创建starter项目如何使用如何改进总结概述现在Java后端Spring是绝对... 查看详情

springboot入门到精通-springboot自动配置原理(代码片段)

SpringBoot源码解析SpringBoot入门到精通-Spring的注解编程(一)SpringBoot入门到精通-SpringBoot入门(二)SpringBoot入门到精通-Spring的基本使用(三)SpringBoot入门到精通-SpringBoot集成SSM(四)SpringBoot入门到精通-SpringBoot自动配置原理(五)SpringBoot入门... 查看详情

springboot基础自动装配原理(代码片段)

目录1、SpringBoot项目构建1.1、官网生成1.2、IDE在线模板生成2、常见配置2.1、入口类和相关注解2.2、Banner2.3、常规配置2.4、日志2.5、profile环境切换2.6、静态资源3、核心原理3.1、自动装配1、搭配@Configuration注解使用2、实现ImportSe... 查看详情

springboot高级原理分析--springboot自动配置:condition(代码片段)

1.SpringBoot自动配置:ConditionCondition是在Spring4.0增加的条件判断功能,通过这个可以功能可以实现选择性的创建Bean操作。1.1需求1:判断定义为静态的在Spring的IOC容器中有一个User的Bean,现要求:导入Jedis坐标后&#... 查看详情

面试题:springboot的自动配置原理及定制starter(代码片段)

3、SpringBoot的自动配置原理packagecom.mmall;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassDemoApplication publicstaticvoidmain(String[]args) SpringApplication.run(DemoApplication.class,arg... 查看详情

springboot:自动配置源码底层原理分析(代码片段)

...自动配置原理配置文件到底能写什么?怎么写?SpringBoot官方文档中有大量的配置,我们无法全部记住,下面我们就梳理一下最核心的几个部分进行讲解。1.分析自动配置原理以HttpEncodingAutoConfiguration(Http编码... 查看详情

浅析springboot多数据源配置(代码片段)

一、多数据源配置1、首先是配置文件  这里采用yml配置文件,其他类型配置文件同理。  这里配置了两个数据源,一个名字叫ds1数据源,一个名字叫ds2数据源,如果你想配置更多的数据源,继续加就行了spring:#数据源配置dat... 查看详情