自动装配原理

问题就是为什么我们直接导入依赖就可以使用了,甚至不用配置web.xml,tomcat等,springboot内部是如何实现的?

主启动类上的注解@SpringBootApplication里有三个重要注解

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

1.@SpringBootConfiguration

这个注解的源码是@Configuration:表示该类为主配置类,可用来装配bean,进一步@Configuration的源码是@Component,说明Spring的配置类也是Spring的一个组件,

SpringBoot本质上就是一个Spring应用,通过这个注解来加载IOC容器的配置。所以在启动类里面标注了@Configuration,意味着它也是一个IOC容器的配置类

 2.@ComponentScan

这个注解作用是扫描配置类下所有包的类,等价于SSM框架整合中springmvc.xml下的:

<context:component-scan base-package="com.lian.controller"/>

3.@EnableAutoConfiguration(重点)

该注解源码包含两个重要注解

first :@AutoConfigurationPackage:自动配置包

作用:给Spring容器中导入一个Registrar注册器组件,这个注解和@ComponentScan有类似作用,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,但是区别是:

@AutoConfigurationPackage会扫描@Enitity、@MapperScan等第三方依赖的注解
@ComponentScan只扫描@Controller/@Service/@Component/@Repository这些常见注解。所以这两个注解扫描的对象是不一样的。

second:@Import(核心):

作用:通过import导入第三方提供的bean的配置类:AutoConfigurationImportSelector:给容器中导入组件,该类下的方法:getCandidateConfigurations(AnnotationMetadata metadata,AnnotationAttributes attributes)作用是获取所有的配置

重点关注

其一

getSpringFactoriesLoaderFactoryClass()顾名思义能够返回spring自动装配的容器

其二

SpringFactoriesLoader.loadFactoryNames的方法读取项目资源和系统资源,从这些资源中遍历了所有的nextElement(自动装配),遍历完成后,封装为properties供我们使用
3个注解需要关注的所有类和方法:

注意点:所有的自动装配类都放在了spring.factories下:

所有的类并不是都生效的,只要导入了对应start核心注解:@ConditionalOnxx,这样自动装配类才能生效才能生效

总结:springboot自动装配通过三大注解完成,在spring.factories中保存了所有的自动装配类,只有拥有注解@ConditionalOnxx的类才拥有启动器,有了启动器才能实现自动装配,才能配置成功。

1.springboot在启动时,从类路径下/META-INF/spring.factories获得指定的值;

2.将这些自动装配成功的类导入IOC容器,自动装配即生效

3.springboot会把所有需要的组件导入,以类名的方式将这些组件添加到容器

4.容器中会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动装配

5.有了自动装配类,我们就不用再手写配置文件了

我的理解:自动装配类实现了我们之前手写的配置文件的内容以及配置文件之间的关联

有个小疑问:我在vue才刚接触到组件这个概念,之前ssm和springmvc印象都没有听过,为什么springboot会说到组件,是结合了前端的一些东西吗??

这个疑问我学几天后再反过来看。

springboot 自动装配的原理的更多相关文章

  1. SpringBoot 自动装配的原理分析

    关于 SpringBoot 的自动装配功能,相信是每一个 Java 程序员天天都会用到的一个功能,但是它究竟是如何实现的呢?今天阿粉来带大家看一下. 自动装配案例 首先我们通过一个案例来看一下自动装配 ...

  2. springboot自动装配大概原理

    自动装配: pom.xml spring-boot-dependence:核心都依赖在父类工程中! 我们在写入或者引入springboot依赖的时候,不需要指定版,因为有这些仓库的版本 启动器:--- ...

  3. SpringBoot自动装配的原理

    1.SpringApplication.run(AppConfig.class,args);执行流程中有refreshContext(context);这句话. 2.refreshContext(co ...

  4. SpringBoot自动装配原理解析

    本文包含:SpringBoot的自动配置原理及如何自定义SpringBootStar等 我们知道,在使用SpringBoot的时候,我们只需要如下方式即可直接启动一个Web程序: @SpringBoo ...

  5. springboot自动装配原理

    最近开始学习spring源码,看各种文章的时候看到了springboot自动装配实现原理.用自己的话简单概括下. 首先打开一个基本的springboot项目,点进去@SpringBootApplica ...

  6. SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  7. springboot自动装配原理,写一个自己的start

    springboot自动装配原理 第一次使用springboot的时候,都感觉很神奇.只要加入一个maven的依赖,写几行配置,就能注入redisTemple,rabbitmqTemple等对象. 这 ...

  8. Springboot自动装配源码及启动原理理解

    Springboot自动装配源码及启动原理理解 springboot版本:2.2.2 传统的Spring框架实现一个Web服务,需要导入各种依赖JAR包,然后编写对应的XML配置文件 等,相较而言,S ...

  9. 【Springboot】Springboot自动装配原理

    1.核心注解就是 EnableAutoConfiguration  该注解会激活SpringBoot的自动装配功能: 代码如下: @Target(ElementType.TYPE) @Retentio ...

  10. springboot自动装配

    Spring Boot自动配置原理 springboot自动装配 springboot配置文件 Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置.难以集成的内容(大多数流行第 ...

随机推荐

  1. ElasticSearch 实现分词全文检索 - 复合查询

    目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...

  2. Day04笔记

    01.explicit的作用(了解) class Maker { public: //explicit只能放在构造函数前面,构造函数只有一个参数或其他参数有默认值时 explicit Maker(in ...

  3. Java:数据表的字段设计了默认值0不生效的原因

    在数据表里给字段设置了默认值为0,但是在插入的时候不生效,数据表设计如下 通过数据表生成的实体类 查看代码 @Data @TableName(value = "user") @No ...

  4. 仓库管理、dockerfile

    Docker仓库管理 ​ 仓库(Repository)是集中存放镜像的地方. Docker Dockerfile 什么是Dockerfile? ​ Dockerfile 是一个用来构建镜像的文本文件, ...

  5. Python常见部分内置方法与操作

    Python常见内置方法与操作 整型int 类型转换 int(其它数据类型),但只支持数字类型和小数类型 >>> num1 = input('Your age>>> ...

  6. 最新版本 Stable Diffusion 开源 AI 绘画工具之图生图进阶篇

    目录 图生图基本参数 图生图(img2img) 涂鸦绘制(Sketch) 局部绘制(Inpaint) 涂鸦蒙版(Inpaint sketch) 上传蒙版(Inpaint upload) 图生图基本参数 ...

  7. BISS-C 8通道采集renishaw传感器及其CRC校验

    背景 BISS-C 是常见的位置编码器传输协议,相对于传统的协议,支持更快的传输速度,电器接口为电压差分RS422或者485,抗干扰能力较强,在精密位置传输中应用广泛. 下述信息源自雷尼绍 典型的请求 ...

  8. 基于【ESLint+JavaScript Standard Style】标准的VUE/JS/html风格指南

    小仙男前端代码风格规范指南v1.0 概述 本规范是适用于小仙男团队及前端团队所搭建的各种前端框架代码的通用风格规范指南: 使用时,请遵循指南细则进行代码风格约束,并在提交之前确保进行代码风格的修正操作 ...

  9. React课堂笔记2

    一.JSX 1.1.什么是JSX JSX = JavaScript XML,这是React官方发明的一种JS语法(糖) 概念:JSX是 JavaScript XML(HTML)的缩写,表示在 JS 代 ...

  10. Go语言入门实战: 猜谜游戏+在线词典

    包含基础语法和入门Go语言的3个案例 速览基础语法 对于耳熟能详的顺序结构.分支结构(if else-if else.switch).循环结构(for)不作赘述. 数组: 长度固定的元素序列 pack ...