返回顶部
首页 > 资讯 > 后端开发 > JAVA >Spring Boot自动装配原理(易懂)
  • 146
分享到

Spring Boot自动装配原理(易懂)

javaspringspringboot后端 2023-08-19 10:08:03 146人浏览 薄情痞子
摘要

Spring Boot的自动装配原理(易懂) 熟练使用spring Boot那么自动装配原理的掌握是必不可少的 文章目录 Spring Boot的自动装配原理(易懂)一、自动装配是什么二、启动类注解流程关系分析1.首先展示

Spring Boot的自动装配原理(易懂)

熟练使用spring Boot那么自动装配原理的掌握是必不可少的


一、自动装配是什么

Spring Boot的自动装配实际上是从META-INF/spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给Spring容器进行管理

二、启动类注解流程关系分析

@SpringBootApplicationpublic class EntryApplication {    public static void main(String[] args) {        SpringApplication.run(EntryApplication.class, args);    }}

1.首先展示@SpringBootConfiguration注解流程图

ORMal{stroke-width:2px;}#mermaid-svg-Icqn9ruvp6qWI73W .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Icqn9ruvp6qWI73W .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Icqn9ruvp6qWI73W .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Icqn9ruvp6qWI73W .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Icqn9ruvp6qWI73W .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Icqn9ruvp6qWI73W .marker.cross{stroke:#333333;}#mermaid-svg-Icqn9ruvp6qWI73W svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Icqn9ruvp6qWI73W .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Icqn9ruvp6qWI73W .cluster-label text{fill:#333;}#mermaid-svg-Icqn9ruvp6qWI73W .cluster-label span{color:#333;}#mermaid-svg-Icqn9ruvp6qWI73W .label text,#mermaid-svg-Icqn9ruvp6qWI73W span{fill:#333;color:#333;}#mermaid-svg-Icqn9ruvp6qWI73W .node rect,#mermaid-svg-Icqn9ruvp6qWI73W .node circle,#mermaid-svg-Icqn9ruvp6qWI73W .node ellipse,#mermaid-svg-Icqn9ruvp6qWI73W .node polyGon,#mermaid-svg-Icqn9ruvp6qWI73W .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Icqn9ruvp6qWI73W .node .label{text-align:center;}#mermaid-svg-Icqn9ruvp6qWI73W .node.clickable{cursor:pointer;}#mermaid-svg-Icqn9ruvp6qWI73W .arrowheadPath{fill:#333333;}#mermaid-svg-Icqn9ruvp6qWI73W .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Icqn9ruvp6qWI73W .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Icqn9ruvp6qWI73W .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-Icqn9ruvp6qWI73W .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-Icqn9ruvp6qWI73W .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Icqn9ruvp6qWI73W .cluster text{fill:#333;}#mermaid-svg-Icqn9ruvp6qWI73W .cluster span{color:#333;}#mermaid-svg-Icqn9ruvp6qWI73W div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Icqn9ruvp6qWI73W :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
@Import(AutoConfigurationPackages.ReGIStrar.class)

2.代码块展示@SpringBootConfiguration注解流程

启动类的@SpringBootAppliation注解是一个组合注解,由以下3个注解组成

@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public @interface SpringBootApplication {

其中@EnableAutoConfiguration 注解又分为以下两种注解

@AutoConfigurationPackage@Import(AutoConfigurationPackages.Registrar.class)  //给容器中导入一个组件public @interface AutoConfigurationPackage {}//利用Registrar给容器中导入一系列组件

其中@AutoConfigurationPackage 注解则由以下注解构成

@Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage {

3.注解含义

@SpringBootConfiguration : 标注在某个类上,表示这是一个Spring Boot的配置类;
@ComponentScan : 配置扫描路径,用于加载使用注解格式定义的bean
@EnableAutoConfiguration : 开启自动装配功能

@AutoConfigurationPackage 指定了默认的包规则 \color{#F0F}{指定了默认的包规则 } 指定了默认的包规则就是将主程序类所在包及所有子包下的组件扫描到Spring容器中;
@Import(AutoConfigurationImportSelector.class) : 通过 @Import 注解导入 AutoConfigurationImportSelector类,然后通过该类的 s e l e c t I m p o r t s \color{#F0F}{selectImports } selectImports方法去读取MATE-INF/spring.factories文件中配置的组件的全类名,并按照一定的规则过滤掉不符合要求的组件的全类名,将剩余读取到的各个组件的全类名集合返回给ioc容器并将这些组件注册为bean

三、详细介绍

1.@AutoConfigurationPackage默认包规则详解

在这里插入图片描述

2.@Import(AutoConfigurationImportSelector.class)进行自动配置详解

利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件**, 按照条件装配( @ C o n d i t i o n a l ) 最终会按需配置 \color{#F0F}{按照条件装配(@Conditional)最终会按需配置} 按照条件装配(@Conditional)最终会按需配置

在这里插入图片描述 


3.当前接口为上图3位置的批量导入器接口

在这里插入图片描述
 

4.当前方法为上图4位置的运行结果

在这里插入图片描述

四、分析条件装配原理

@Conditional
在这里插入图片描述

1.谈到Spring Boot项目最重要的starter场景启动器

在这里插入图片描述 Spring Boot所有的自动配置功能都在 spring-boot-autoconfigure 包里面,Spring Boot 自动装配会通过引入了哪些场景这个场景的自动配置才会开启生效,

2.最重要的控制器(dispatcherServlet)

Spring mvc中最重要的控制器(dispatcherServlet)也配置好了
在这里插入图片描述

3.文件上传解析器配置

@Bean@ConditionalOnBean(MultipartResolver.class)  //容器中有这个类型组件@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME) //容器中没有这个名字 multipartResolver 的组件public MultipartResolver multipartResolver(MultipartResolver resolver) {//给@Bean标注的方法传入了对象参数,这个参数的值就会从容器中找。//springMVC multipartResolver。防止有些用户配置的文件上传解析器不符合规范// Detect if the user has created a MultipartResolver but named it incorrectlyreturn resolver;}给容器中加入了文件上传解析器;

以前Spring MVC中要配置文件解析器,名字必须叫multipartResolver ,但是很多人不知道默认行为,Spring Boot可以将你配置的解析器,用默认名称返回,防止不符合规范

4.字符集配置

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

五、总结

最重要的包 spring-boot-autoconfigure
Spring Boot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先

1.为什么不一次全部加载到容器中

如果Spring没有添加任何的附加条件,此时这些配置类中所定义的bean都会被导入到Spring容器中,这样
非常消耗内存,因此在Spring中提供了很多的条件注解,通过这些条件注解控制某一个配置是否生效。

2.简单总结:

在项目启动的时候,Spring Boot框架会自动读取META-INF/spring.factories配置文件中org.springframework.boot.autoconfigure.EnableAutoConfiguration所配置的配置类,然后将其中所定义的bean根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。

3.详细总结

  1. 在Spring Boot项目中有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
    其中@EnableAutoConfiguration是实现自动化配置的核心注解。
  2. 该注解通过@Import注解导入AutoConfigurationImportSelector,这个类实现了一个导入器接口ImportSelector。在该接口中存在一个方法selectImports,
  3. 该方法的返回值是一个数组,数组中存储的就是要被导入到spring容器中的类的全类名。在AutoConfigurationImportSelector类中重写了这个方法,
  4. 该方法内部就是读取了项目的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。
  5. 在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。

来源地址:https://blog.csdn.net/qq_41805567/article/details/129111183

--结束END--

本文标题: Spring Boot自动装配原理(易懂)

本文链接: https://lsjlt.com/news/375321.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作