高频面试题-请聊一下Springboot自动装配原理!

简介: 自从SpringBoot的出现,让Java的基本系统搭建过程变得更简单,不需要关心很多的配置文件,也不需要去关心市面上各版本的包存在版本冲突等等的问题,使得SpringBoot让开发人员推崇备至。

SpringBoot


在面试过程中,SpringBoot的面试题也同样是非常频繁的,简单点的有SpringBoot有哪些核心注解?SpringBoot如何启动?SpringBoot中yml配置文件有什么不同之处?等等吧,问这些都是在检测你是否对SpringBoot有了解。


当然还有一些细节点的面试题有SpringBoot如何实现热部署?SpringBoot如何设置服务端口号?SpringBoot如何做到切换不同环境的配置文件?等等,这些问题就不同了,如果面试官问出了这些,许是在检测你是否真正的使用过SpringBoot,或者是否对SpringBoot项目有一定的基础。


除了以上面试题目之外,还会有些问题,用于检测你是否对SpringBoot有更深入的研究,不再局限于使用层面,比如:SpringBoot如何实现的自动装配?SpringBoot中starter的原理?等等。


今天我们就是来说一下SpringBoot中的自动装配原理,自动装配是SpringBoot中的一个非常重要的,也是非常具有特色的功能,下面就来看一下吧。


自动装配


从启动类开始看


说起SpringBoot中的自动装配,首先要从SpringBoot的启动类开始看。

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

这是一个基本的SpringBoot启动类,我们主要看SpringBootApplication这个注解,点进去源码,看一下具体的实现。a0e59f6580cd87b018c5b0ad5dd70aa.png


根据图中的信息,我们完全可以看得出来,SpringBootApplication这个注解,是一个复合注解。

SpringBootConfiguration注解,可能会有些陌生,但是对于@Configuration注解的话,就一定不会了;ComponentScan也是我们在Spring项目中常常会用到的扫描注解。


主要还是来说一下@EnableAutoConfiguration注解,自动配置注解,也可以说自动装配,既然是要聊自动装配原理,那也就是聊一下@EnableAutoConfiguration注解的具体实现了,下面就来看一下吧。


开启自动配置注解@EnableAutoConfiguration


看一下此注解的源码实现,如下图。a8e686709c4a7c6ca2d2f6a951a4f54.png


在这个注解实现中,从AutoConfiguration注解开始看起。

简单说下在此之上的注解,如果你写过自定义注解的话,就能很好的分辨这几种的概念了。

@Target({ElementType.TYPE}) : 用于声明注解作用范围,TYPE表示:可用来修饰接口、类、枚举、注解;还有其他的枚举类型,如果有兴趣可以去自行搜索一下。
@Retention(RetentionPolicy.RUNTIME) :用于声明注解的生命周期,RUNTIME表示:在运行时有效。
@Documented :用于声明注解文档化,如果被此注解修饰,就可以用javadoc进行记录,成为了一个公共的API。
@Inherited :用于加强继承效果。

回到正题,接着说。

AutoConfiguration注解同样不是实现自动装配的注解,在Spring中,此注解用来扫描实体类Entity等注解。


Import注解才是自动装配的核心,继续深入。

Import注解实现了AutoConfigurationImportSelector类,自动装配也是在这个类中进行了具体的实现。


AutoConfigurationImportSelector类中实现了诸多方法,自动装配的实现则是在selectImports方法中,如图所示。

f8fd835ca0a440923c682c8e2a3e966.png


从源码中读起来,有一个getCandidateConfigurations方法,进入看一下代码情况。61bedb272bc9a243e60d6dc45dc2b95.png


这里存在一个断言,意为无法正确的找到spring.factories文件,结果就很自然了,这个方法就是去加载了spring.factories文件,让我们去找一下这个文件里面具体是什么内容吧。

通过IDEA中的当前类定位按钮进行寻找,


b9647a0b340b15596f5a29f7764810c.png



在这里能找到文件,如图:


b9db2575b819c2ac42439ddf1de433e.png



文件内容如图:


ce221c624d09852b87c951d55c779de.png


可以看出,通过selectImports方法,取到该文件下的一系列类名,随后将这些类自动加载至IOC容器中。

这些类都属于内部存在自动配置的类,同样可以发现这些类名都是以AutoConfiguration结尾的。


总结


自动装配原理就已经说完了,总结一下,就是通过@EnableAutoConfiguration注解,加载AutoConfigurationImportSelector类中的selectImports方法,进而扫描MATE-INF下的spring.factories文件下的自动配置类,并将其装配至IOC容器的过程。


目录
相关文章
|
12月前
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
3046 0
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
1491 0
|
11月前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
686 4
|
11月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
826 2
|
前端开发 Java 数据库连接
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
SpringBoot参数校验底层原理和实操。深度历险、深度解析(图解+秒懂+史上最全)
|
Java Spring
SpringBoot自动配置原理
本文深入解析了SpringBoot的核心功能——自动配置,重点探讨了`org.springframework.boot.autoconfigure`及相关注解的工作机制。通过分析`@SpringBootApplication`、`@EnableAutoConfiguration`等注解,揭示了SpringBoot如何基于类路径和条件自动装配Bean
791 9
SpringBoot自动装配的原理
在SpringBoot项目的启动引导类上都有一个注解@SpringBootApplication 这个注解是一个复合注解, 其中有三个注解构成 , 分别是 ● @SpringBootConfiguration : 是@Configuration的派生注解 , 标注当前类是一个SpringBoot的配置类 ● @ComponentScan : 开启组件扫描, 默认扫描的是当前启动引导了所在包以及子包 ● @EnableAutoConfiguration : 开启自动配置(自动配置核心注解) 2.在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoC
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
1016 0
|
安全 Java 数据格式
这10道springboot常见面试题你需要了解下
1、什么是Spring Boot? 多年来,随着新功能的增加,spring变得越来越复杂。只需访问https://spring.io/projects页面,我们就会看到可以在我们的应用程序中使用的所有Spring项目的不同功能。
5348 0
|
11月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。