Spring Boot 核心理解-自动装配
自动装配
spring boot的自动装配(auto configuration)是通过spring framework的依赖注入(dependency injection, DI)和配置类的组合来实现的。 spring boot 的自动装配机制可以简化应用的配置过程,是开发者不再需要手动创建配置文件或管理bean. 而是通过注解和配置类自动完成。
- springboot 自动装配的原理
- 依赖注入的核心注解
- 自动配置类的加载机制
- @SpringBootApplication注解详解
- 自定义配置和自动配置的关系
- 常见的自动装配场景
- 总结
springboot自动装配的原理:
springboot的自动装配是基于以下几个核心机制实现的:
@SpringBootApplication: 它是一个组合注解,包含了@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan.
- @SpringBootConfiguration: 主要是声明该类是一个配置类,这是Springboot专用的配置声明类
- @EnableAutoConfiguration: 启动springboot 自动配置机制的核心注解,它会根据类路径下的依赖来自动装配Spring应用程序。
- @ComponentScan: 扫码@Component @Service @Repository @Controller等标注的类,使得这些bean自动注册到spring容器中。如果没有配置路径或者类。直接扫描该类所在包及其子包中的组件。
- spring.factories: SpringBoot 使用spring-boot-autoconfigure中的META-INFO/spring.factories文件来管理自动装配的的类。spring.factories文件中列出的所有的自动配置类,这些类在启动时都会被加载并注册
依赖注入的核心注解:
SpringBoot 依赖于springFramework 的依赖注入机制,通过注解实现Bean的自动装配。主要注解有:
- @Autowired: 可以注入构造方法、字段、Setter方法。 Spring会根据类型在容器中查找匹配的Bean并注入
- @Component、@Service、@Repository、@Controller标识类为spring管理的Bean. 其中@Component是通用的注解, 而@Service、@Repository、@Controller是它的变种,分别用于业务逻辑层、数据访问层、控制层
- @Configuration: 表示一个配置类,可以定义@Bean方法,将返回的bean注册到Spring容器中。
@Configuration public class MyConfiguration{@Beanpublic MyService myService(){return new MyService();} }自动配置类的加载机制
-
Spring Boot通过@EnableAutoConfiguration启动自动配置机制,他会扫描spring.factories文件中配置的自动配置类,并通过条件注解(如@ConditionalOnClass @ConditionalOnMissingBean)决定是否加载这些配置类。
-
条件注解: 自动配置类中使用条件注解来控制配置的生效,常见的条件注解有:
-
@ConditionalOnClass: 当类路径下存在指定的类时,配置才会生效。
-
@ConditionalOnMissingClass: 当Spring容器中没有指定类型的bean时,才会创建Bean.
-
@ConditionalOnProperty: 当配置文件中存在特定的属性时,配置才会生效。
例如,Spring Boot 提供的 DataSource 自动配置类 DataSourceAutoConfiguration:
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic DataSource dataSource(DataSourceProperties properties) {// 创建 DataSource Bean}
}
当项目中引入了数据库依赖(如 HikariCP),DataSourceAutoConfiguration 会自动配置一个 DataSource 对象。
@SpringBootApplication 注解详解
@SpringBootApplication 是一个组合注解,通常放在主启动类上:
@SpringBootApplication
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}
其中包含了:
@SpringBootConfiguration:等价于@Configuration,标识该类为配置类。@EnableAutoConfiguration:启用 Spring Boot 的自动配置机制。@ComponentScan:扫描该类所在包及其子包中的@Component、@Service、@Repository等注解。
自定义配置和自动配置的关系
在使用自动装配时,可以通过手动定义的 @Bean、@Configuration 优先覆盖自动配置类中的默认配置。例如,自定义一个 DataSource:
@Configuration
public class CustomDataSourceConfig {@Beanpublic DataSource customDataSource() {return new HikariDataSource();}
}
这样,即使自动配置类中也定义了 DataSource,但由于 @ConditionalOnMissingBean 的存在,自定义的 DataSource 会优先被加载。
定制自动配置:可以通过以下几种方式定制 Spring Boot 的自动配置:
@ConditionalOnProperty:通过属性控制自动配置的启用或禁用。例如,通过设置spring.datasource.enabled=false可以禁用数据源的自动配置。- 自定义
@Configuration类:可以通过编写自定义的@Configuration类来覆盖默认的自动配置。 @Import:可以手动导入一些自动配置类来精确控制自动配置的内容。
常见的自动装配场景
- 数据库配置:通过引入
spring-boot-starter-data-jpa或spring-boot-starter-jdbc,Spring Boot 自动配置数据源、JPA 实体管理等。 - Web 框架配置:引入
spring-boot-starter-web,Spring Boot 会自动配置DispatcherServlet、JacksonJSON 解析器等。 - 消息队列配置:引入
spring-boot-starter-amqp,自动配置 RabbitMQ 连接工厂、模板和监听器容器。
总结
Spring Boot 的自动装配极大地简化了 Spring 应用的开发:
- 减少配置文件:开发者不需要在
XML或 Java 配置类中显式配置每个组件,Spring Boot 会根据类路径中的依赖自动加载相应的配置。 - 减少样板代码:在传统的 Spring 应用中,我们可能需要编写很多
@Configuration类来设置数据源、事务管理器、视图解析器、消息转换器等。但在 Spring Boot 中,大部分常见的配置都是自动配置好的,开发者只需要关注业务逻辑。例如,若要使用 Spring MVC,传统 Spring 需要配置 DispatcherServlet 和 ViewResolver 等,但在 Spring Boot 中,只需要在类路径中添加spring-boot-starter-web依赖即可,Spring Boot 会自动配置这些组件。 - 按需加载:通过条件注解和
spring.factories文件,Spring Boot 只加载需要的配置。 - 可扩展性强:可以通过自定义配置或修改
application.properties文件中的属性,灵活调整自动配置的行为。
相关文章:
Spring Boot 核心理解-自动装配
自动装配 spring boot的自动装配(auto configuration)是通过spring framework的依赖注入(dependency injection, DI)和配置类的组合来实现的。 spring boot 的自动装配机制可以简化应用的配置过程,是开发者不再需要手…...
go 中指针的执行效率比较
package main import ("fmt""time" ) type Books struct {title stringauthor stringsubject stringbook_id int } func main() {start : time.Now() // 记录开始时间var Book1 Books /* 声明 Book1 为 Books 类型 */var Book2 Books /* 声明…...
单链表的经典算法OJ
目录 1.反转链表 2.链表的中间节点 3.移除链表元素 ——————————————————————————————————————————— 正文开始 1.反转链表 typedef struct ListNode ListNode; struct ListNode* reverseList(struct ListNode* head) {//判空if(…...
视频网站开发:Spring Boot框架的高效实现
5 系统实现 5.1用户信息管理 管理员管理用户信息,可以添加,修改,删除用户信息信息。下图就是用户信息管理页面。 图5.1 用户信息管理页面 5.2 视频分享管理 管理员管理视频分享,可以添加,修改,删除视频分…...
【前端】如何制作一个自己的网站(11)
接上文。 除了前面的颜色样式外,字体样式和文本样式也是网页设计中的重要组成部分。 合适的字体和文本排版,不仅可以使页面更加美观,也可以提升用户体验。接下来,我们先来看看CSS如何设置字体样式。 字体样式 同时设置了字体样…...
【Conda】提高 Conda 下载速度与兼容性的完美指南
这里写目录标题 引言1. Conda 官方源1.1 常用官方源1.2 源的选择1.3 源的作用 2. 设置 Conda 源2.1 查看当前配置2.2 添加新的源2.3 设置源的优先级2.4 移除源2.5 示例:设置使用 conda-forge 3. 使用中国镜像源3.1 常用中国镜像源3.2 设置中国镜像源3.3 验证镜像源设…...
【Flutter】页面布局:层叠布局(Stack、Positioned)
在 Flutter 中,布局系统提供了多种方式来管理 UI 元素的排列方式。其中,Stack 和 Positioned 是非常重要的布局组件,允许开发者将子组件按层叠方式(即堆叠)布局,使得组件可以相互重叠。通过使用 Stack 和 P…...
SpringBoot实现的汽车票在线预订系统
2相关技术 2.1 MySQL 数据库 MySQL 是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非…...
集合框架14:TreeSet概述、TreeSet使用、Comparator接口及举例
视频链接:13.29 TreeSet概述_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?spm_id_from333.788.videopod.episodes&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5&p29 1、TreeSet概述 基于排列顺序实现元素不重复;实现了Sort…...
uniapp获取底部导航tabbar的高度(H5)
uniapp获取底部导航tabbar的高度(H5) <view :style"bottom: tabBarHeight px;"> </view>tabBarHeight: 0, // 底部tabBar高度, h5// #ifdef H5 getTabBarHeight(){const systemInfo uni.getSystemInfoSync()this.t…...
接口测试 —— 如何测试加密接口?
接口加密是指在网络传输过程中,将数据进行加密,以保护数据的安全性。接口加密可以采用多种加密算法,如AES、DES、RSA等。测试接口加密的目的是验证接口加密算法的正确性和安全性。以下是一些详细的测试方法和注意事项: 接口加密字…...
033 商品搜索
文章目录 SearchController.javaPage.javaSpuInfoServiceImpl.javaSpuInfoService.javaCubemallSearchApplication.javasearch.htmlpom.xml 功能分析 页面回显的数据: searchMap keywords:搜索的关键词 brand:过滤条件-品牌 category&…...
身份证二要素实名认证接口-身份证核验接口-身份证实名API
接口简介:企业三要素验证,输入公司名称、统一社会信用代码、法人姓名验证是否一致 接口地址:https://www.wapi.cn/api_detail/62/169.html 在线核验:https://www.wapi.cn/icardauth.html 网站地址:https://www.wapi.cn…...
一次恶意程序分析
首先F12shift查看字符表 字符表发现可疑字符串 双击进入 再tab 进入这里 推测为main函数 可见一些可疑的api FindResourceW推测该木马使用了资源加载 VirtualAlloc申请内存 然后sub_1400796E0 有 dwSize 参数 推测为 拷贝内存 memcpy类似函数 、 然后sub_140078CB0函数 跟进函…...
Javaweb基础-vue
Vue.js Vue是一套用于构建用户界面的渐进式框架。 起步 引入vue <head><script src"static/js/vue2.6.12.min.js"></script> </head> 创建vue应用 <body> <div id"index"><p>{{message}}</p> </div>…...
2. MySQL数据库基础
一、数据库的操作 1. 显示当前的数据库 SHOW DATABASES;2. 创建数据库 语法: CREATE DATABASE [IF NOT EXISTS] db_name [create_specification...];//create_specification包括:[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_n…...
java集合进阶篇-《泛型》
个人主页→VON 收录专栏→java从入门到起飞 目录 一、前言 二、泛型的简要概述 三、泛型的基本概念 类型参数: 通配符: 边界: 使用泛型的好处: 四、泛型类 五、泛型方法 六、思考 七、疑惑 一、前言 泛型对于我来说又…...
pytorh学习笔记——cifar10(三)模仿VGGNet创建卷积网络
VGG16是由牛津大学视觉几何组(Visual Geometry Group)提出的一种深度卷积神经网络模型。 VGGNet 探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了 16~19 层深的卷积神经网络,同时拓展性又很强,迁移到其它图片…...
题目:连续子序列
解题思路: 首先,不能使用暴力枚举,时间为O(n2),超时。以下为正确做法: 假设找到一段区间(其和>m),如上图黄色部分,那么该区间加上i后面的元素形成的新区间和都>m&a…...
深入解析:Nacos AP 模式的实现原理与应用场景
优质博文:IT-BLOG-CN 一、CAP 基础 Nacos作为注册中心同时支持CP和AP模式。 Nacos通过不同的协议和机制来实现这两种模式,以满足不同的需求场景。 在Nacos中,默认情况下使用的是AP模式,通过Distro协议来实现。AP模式主要关…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
