SpringBoot的核心内容之自动装配

不面试不知道,现在面试的问题真的是五花八门的,最近就有读者说,在面试的过程中,面试官还提到了关于最初版本的 Spring 还有 SpringMVC 以及现在的 SpringBoot 中的一些相关问题,比如他提到了这个 SpringBoot 的自动装配是什么,你是怎么理解的,今天了不起就和大家一起来看看这个关于 SpringBoot 的自动装配。

SpringBoot装配机制

SpringBoot的自动装配是一种机制,它可以帮助开发者更快地搭建和运行Spring应用。SpringBoot的自动装配依赖于其提供的starter依赖,这些starter依赖包含了Spring应用所需的大部分配置,使得开发者不需要手动配置这些通用的功能。

如果我们这么回答,可能面试官听到就不是很满意了,这时候,我们就得抓住要点来进行分析,这样回答的时候,势必肯定能抓到重点,毕竟面试的时候,每个人的回答肯定也都是不一样的。

1.约定优于配置

2.核心注解

3.自动扫描

我们来一个一个的解释这些内容指的到底是什么意思:

约定优于配置

SpringBoot的约定优于配置(Convention Over Configuration)主要体现在以下几个方面:

自动配置:SpringBoot根据项目的类路径下的jar包依赖关系,自动配置相应的Bean。例如,当检测到HSQLDB数据库驱动在类路径下时,它会自动配置一个嵌入式数据库实例和相关的JPA/Hibernate设置。

目录结构约定:SpringBoot遵循一定的目录结构约定,使得开发者可以将代码和资源放在约定的目录下,而不需要在配置文件中指定。例如,静态资源默认放在src/main/resources/static或src/main/resources/public目录下,模板文件默认在src/main/resources/templates下。

Starter依赖:SpringBoot提供了一系列的Starter依赖,这些Starter依赖是预定义的依赖集合。通过引入相应的Starter依赖,可以自动引入相关的库和默认配置,从而简化了项目的依赖管理。例如,通过引入spring-boot-starter-web依赖,就能够快速搭建一个基于Spring MVC的Web应用。

核心注解EnableAutoConfiguration

EnableAutoConfiguration 是 Spring Boot 的核心注解之一,它告诉 Spring Boot 根据你添加的 jar 依赖项自动配置你的应用程序。Spring Boot 会自动配置许多方面,例如数据源、消息代理、安全设置等,你通常不需要手动设置它们。

这个注解的工作原理是基于在项目的类路径(classpath)中查找特定的 jar 依赖项。一旦找到这些依赖项,Spring Boot 就会自动配置相关的 bean。这减少了大量手动配置和样板代码的需求,使开发者能够专注于他们的应用程序逻辑。

@EnableAutoConfiguration 注解通常放在主应用程序类上,这是带有 main 方法的类,该类使用 SpringApplication.run() 方法启动 Spring Boot 应用程序。

这里是 @EnableAutoConfiguration 注解的基本用法:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableAutoConfiguration
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}

在这个例子中,@EnableAutoConfiguration 注解启动了自动配置。Spring Boot 会根据类路径中的 jar 依赖项来自动配置 bean。

那么EnableAutoConfiguration 是如何工作的呢?

@EnableAutoConfiguration 注解实际上是一个组合注解,它包含了 @AutoConfigurationPackage 和 @Import(AutoConfigurationImportSelector.class)。

@AutoConfigurationPackage 注解确保 @Configuration 类(通常位于主应用程序类中)被考虑在内,以便它可以被自动配置的 beans 使用。@Import(AutoConfigurationImportSelector.class) 注解告诉 Spring Boot 从 META-INF/spring.factories 配置文件中加载 auto-configuration 类。Spring Boot 提供了许多这样的配置文件,每个文件都针对特定的技术或功能(如数据源、Web MVC 等)。当 Spring Boot 启动时,它会加载 META-INF/spring.factories 配置文件,并根据你的类路径中的依赖项选择适当的自动配置类。然后,这些自动配置类会注册额外的 beans 到 Spring 的上下文中。

如果你不想使用某个特定的自动配置,你可以使用 @EnableAutoConfiguration 注解的 exclude 属性来排除它。

比如我们排除某个特定的自动配置

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.Configuration;@Configuration
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}

总之,@EnableAutoConfiguration 注解是 Spring Boot 的核心特性之一,它简化了 Spring 应用程序的配置过程,使开发者能够专注于实现业务逻辑。

自动扫描

Spring Boot 的自动扫描是 Spring 框架的一个特性,在 Spring Boot 中得到了进一步的简化和增强。它允许 Spring Boot 应用程序自动发现和注册 bean,减少了开发者需要手动配置和声明 bean 的数量。

那自动扫描都做了哪些事情呢?

组件扫描:默认情况下,Spring Boot 会扫描启动类(通常是带有 @SpringBootApplication 注解的类)所在的包以及其子包下的所有类。它会查找带有 @Component、@Service、@Repository 和 @Controller 等注解的类,并将它们作为 Spring 容器中的 bean 进行注册。

配置类扫描:除了普通的组件,Spring Boot 还会扫描 @Configuration 注解的类,这些类通常包含 @Bean 方法定义,用于声明和配置额外的 bean。

自动配置类扫描:Spring Boot 还会扫描 META-INF/spring.factories 配置文件,以加载和应用自动配置类。这些自动配置类通常根据类路径下的库和依赖项来提供默认的配置。

资源扫描:除了组件和配置类,Spring Boot 还会自动扫描静态资源,如 HTML、CSS、JavaScript 文件以及模板文件(如 Thymeleaf、FreeMarker 等)。这些资源通常放在特定的目录下,如 src/main/resources/static 或 src/main/resources/templates。

要开启或调整组件扫描的范围,你可以使用 @ComponentScan 注解。

这个注解我们都不用多说了把,指明扫包路径

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
@ComponentScan(basePackages = "com.example.myapp") // 指定扫描的包路径
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/4048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【人工智能基础】线性回归实验分析

实验使用到的库:numpy、matplotlib、scikit-learn 实验使用的开发环境:anaconda、jupyter 一、线性回归 线性回归就是使用一个线性函数(多项式回归可以是曲线)去拟合给定的训练集,测试时,对输入的x值&#…

Selenium一本通

Selenium中文官方文档 从一个测试脚本说起 from selenium import webdriver #引入selenium webdriver模块 driver webdriver.Firefox() #初始化Firefox浏览器的webdriver对象,启动浏览器 driver.get("http://cn.bing.com/") #跳转到对应页面 assert Bi…

Jammy@Jetson Orin - Tensorflow Keras Get Started: Concept

JammyJetson Orin - Tensorflow & Keras Get Started: Concept 1. 源由2. 模型2.1 推理流程2.1.1 获取图像2.1.2 算法识别2.1.3 判断决策 2.2 理想情况2.2.1 多因素输入2.2.2 理想识别概率 2.3 学习过程2.3.1 标记训练集2.3.2 损失函数2.3.3 训练网络2.3.4 渐进方法 3. 总…

jvm(JVM快速入门、stack栈、堆、GC垃圾回收、Arthas)

文章目录 1. JVM快速入门1.1. 结构图1.2. 类加载器ClassLoader1.3. 执行引擎Execution Engine1.4. 本地接口Native Interface1.5. Native Method Stack1.6. PC寄存器(程序计数器)1.7. Method Area方法区 2. stack栈3. 堆3.1. 堆体系概述3.1.1. 新生区3.1.2. 老年代3.1.3. 永久代…

Python 打包:pyinstaller

目录 为什么选择它用法详解所有命令常规-h-v、 --version--distpath DIR--workpath Workpath-y、 --noconfirm--upx dir upx_dir Upx-a、 --ascii--clean--log-level LEVEL 生成内容-D、 --onedir-F、 --onefile--specpath DIR-n NAME,--NAME NAME-w 执行程序 为什么…

python基础知识点(蓝桥杯python科目个人复习计划66)

今日复习内容:算法双周赛 第一题:疯狂星期六 题目描述: 麦肯鸡是一家名声在外的汉堡店,他们最近推出了一份名为vivo50的套餐,只需要在门口大声喊出vivo50,就可以获得这个套餐。 现在,请你打…

【VUE】解决 Element UI 中 el-tab 切换时 ECharts 渲染宽度问题

解决 Element UI 中 el-tab 切换时 ECharts 渲染宽度问题 在使用 Element UI 的 el-tabs 组件时,我们常常会遇到一个问题:当 ECharts 图表被放在非当前激活的 Tab 内时,图表无法正确渲染其宽度和高度。由于在 Tab 未激活状态下,图…

[Java、Android面试]_21_Dalvik VM与JVM的区别

欢迎查看合集: Java、Android面试高频系列文章合集 文章目录 1. 结构2. 编译3. 运行环境4. Dalvik进程管理 Dalvik是android系统中的虚拟机,JVM是java虚拟机。 Dalvik VM可以支持将已转化为.dex文件格式的java应用程序的运行,.dex是专为Dalvi…

Windows程序设计 - 字符与字符串处理

目录 字符编码的问题 ANSI Vs Unicode 函数版本区分 C RunTime库 老生常谈的ASCII和UNICODE支持性 安全字符串函数 推介的字符和字符串处理的方式 ASCII与UNICODE互转 Reference 字符编码的问题 对于一些像我这样的初学者:很喜欢认为字符串的处理就是将字…

了解ASK模块STX883Pro和超外接收模块SRX883Pro的独特之处 STX883Pro模块具有以下特点:

高发射功率:STX883Pro具有较高的发射功率,可实现长距离的信号传输,适用于需要覆盖广泛区域的应用场景。 高频率稳定性:具备稳定的频率输出,确保信号传输的可靠性和一致性,避免频率漂移导致的通信故障。 大…

Ubuntu 18.04 安装 CMake Ceres-Solver 记录

1. 安装 CMake-3.22.1 不可卸载原有版本 CMake(防止 ROS 出现问题),只需建立软链接即可 1. 源码下载并解压wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz tar -xvzf cmake-3.22.1.tar.gz2. 移动到合适目录sudo mv cmake-3.22.1 /u…

C++ | Leetcode C++题解之第48题旋转图像

题目&#xff1a; 题解&#xff1a; class Solution { public:void rotate(vector<vector<int>>& matrix) {int n matrix.size();// 水平翻转for (int i 0; i < n / 2; i) {for (int j 0; j < n; j) {swap(matrix[i][j], matrix[n - i - 1][j]);}}//…

Thread方法具体解析

对于run方法 如果该线程是使用单独的 Runnable run 对象构造的&#xff0c;则调用该 Runnable 对象的 run 方法&#xff1b;否则&#xff0c;此方法不执行任何操作并返回。 对于start方法 导致该线程开始执行&#xff1b; Java虚拟机调用该线程的run方法。 这里介绍一个快捷键…

Java Spring 中构造函数注入和Setter注入的优缺点

在使用Java Spring框架进行依赖注入时&#xff0c;我们常常会遇到构造函数注入和Setter注入两种方式。这两种方式各有优缺点&#xff0c;本文将对它们进行比较和分析&#xff0c;帮助开发者在实际项目中做出合适的选择。 构造函数注入 构造函数注入是通过在类的构造函数中传入…

Windows Vscode ModuleNotFoundError: No module named

故障现象&#xff1a; Windows Vscode 经常会遇到模块路径查找失败的异常。 如运行2_from_import_test.py后&#xff0c;报错&#xff1a; 发生异常: ModuleNotFoundError No module named programmer File "D:\leolab\programmer\2_from_import_test.py", line 8…

什么是数字化运营?

目录 一、什么是数字化运营&#xff1f; 二、数字化运营的重要性是什么&#xff1f; 三、数字化运营的具体步骤和措施是什么&#xff1f; 四、数据化决策是什么&#xff1f; 一、什么是数字化运营&#xff1f; 数字化运营是利用数字技术和数据分析来优化企业的业务流程和运…

C语言 | Leetcode C语言题解之第51题N皇后

题目&#xff1a; 题解&#xff1a; int solutionsSize;char** generateBoard(int* queens, int n) {char** board (char**)malloc(sizeof(char*) * n);for (int i 0; i < n; i) {board[i] (char*)malloc(sizeof(char) * (n 1));for (int j 0; j < n; j) board[i][…

LeetCode-104-二叉树最大深度

题目&#xff1a; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 思路&#xff1a;不断往下遍历&#xff0c;每往深层遍历一层&#xff0c;深度加一&#xff0c;当遍历到null&#xff0c;与当前最大…

Linux内核驱动开发-006内核定时器

1驱动程序 /*************************************************************************> File Name: timer.c> Author: yas> Mail: rage_yashotmail.com> Created Time: 2024年04月23日 星期二 19时20分42秒*************************************************…

每日JAVA高级面试题

Java 高级面试问题及答案 以下是一些在Java高级面试中可能会遇到的问题&#xff0c;以及对这些问题的探讨和回答。 问题 1: Java内存模型是什么&#xff1f;请解释其重要性。 探讨&#xff1a; Java内存模型&#xff08;Java Memory Model, JMM&#xff09;是Java虚拟机&…