深入解析Spring Boot自动配置原理:让你的应用无痛集成

news2024/11/25 2:56:20

1.前言

        1.1springboot的优势

Spring Boot是一个用于构建独立、生产级的Spring应用程序的开发框架,它在简化配置、提高开发效率、增强功能丰富性等方面具有以下优势:

  1. 简化配置:Spring Boot采用了约定优于配置的原则,通过自动配置和默认属性设置,大大减少了开发者需要手动配置的工作量。它使用了一些智能推断和默认值机制,可以根据项目的依赖和环境来自动配置应用程序,并提供了一个统一的配置文件(application.properties或application.yml)来集中管理配置。

  2. 快速开发:Spring Boot提供了一套简洁、一致的编码风格和开发模式,使得开发者可以快速搭建和开发应用程序。它提供了内嵌的Servlet容器(如Tomcat、Jetty),省去了部署的繁琐步骤,可以直接运行项目。此外,Spring Boot还提供了丰富的Starter依赖,可以快速集成常用的第三方库和框架,减少了开发的重复劳动。

  3. 微服务支持:Spring Boot天然支持微服务架构的开发。它提供了Spring Cloud生态系统,集成了众多微服务相关组件(如服务注册与发现、负载均衡、断路器、配置中心等),可以方便地搭建和管理微服务应用。同时,Spring Boot还提供了对容器化部署的支持,可以直接打包成Docker镜像,并与容器编排工具(如Kubernetes)无缝集成。

  4. 自动化测试:Spring Boot对于单元测试和集成测试提供了很好的支持。它引入了JUnit和Spring Test框架,并通过自动配置和模拟对象等技术,简化了测试的编写和执行过程。开发者可以快速编写可靠的测试用例,并使用Spring Boot的测试工具集成测试各个组件和功能。

  5. 监控和管理:Spring Boot提供了丰富的监控和管理功能,可以帮助开发者更好地了解应用程序的运行状况和性能指标。它集成了Actuator模块,可以通过HTTP或JMX暴露出一系列的端点(endpoints),包括应用信息、健康状况、性能指标等,方便实时查看和监控应用程序。

总的来说,Spring Boot通过简化配置、提高开发效率、支持微服务架构、优化测试和监控等方面的特性,使得开发者可以更加专注于业务逻辑的实现,快速构建高质量的应用程序。它的优势在于简化和规范化了Spring应用开发的过程,提供了一种快速、便捷、高效的开发体验。

         1.2spring和springboot对比

 spring框架:需要手动引入大量的依赖,并且我们所引入的依赖版本还要匹配,否则就可能出现版本冲突的问题,这是非常繁琐的

 springboot框架:引入起步依赖即可,原理就是maven的依赖传递。

2.springboot的原理分析

        2.1起步依赖 

起步依赖:大大简化pom文件中依赖的配置就可以来解决spring框架中依赖配置繁琐的问题

主要原理就是maven的依赖传递

Spring Boot使用了Spring框架的依赖注入机制来管理对象之间的依赖关系。依赖注入是指将一个对象所依赖的其他对象,通过注入的方式来实现,而不是在对象内部通过new关键字主动创建依赖对象。

Spring Boot使用了IoC容器(Inversion of Control)来管理对象和它们之间的依赖关系。在Spring Boot应用中,可以通过在类上添加注解(如@Component、@Service、@Controller等)将类标记为一个可被Spring管理的组件。当应用启动时,Spring会自动扫描并创建这些组件,并将它们注册到IoC容器中。

当一个组件需要依赖其他组件时,可以通过构造函数、属性注入或方法注入等方式来实现。Spring框架会根据依赖关系自动将相应的依赖组件注入到目标组件中,从而完成依赖注入

        2.3自动配置 

  1. 自动配置(Auto-configuration): Spring Boot的自动配置使用了条件化配置的机制。它通过扫描项目的classpath和注解,根据预定义的条件来决定是否要自动配置某个组件或功能。自动配置是通过@Configuration注解的类实现的,这些类被称为自动配置类(AutoConfiguration Classes)。

    自动配置类通常使用了条件注解(@Conditional)来判断是否满足某个条件。如果满足条件,那么就会执行自动配置逻辑,将相关的组件注册到Spring容器中。例如,当classpath中存在特定的库时,自动配置类会根据这个条件来决定是否要进行相应的配置。

    自动配置还可以使用外部的配置文件(application.properties或application.yml)来进行参数的配置,从而进一步定制自动配置的行为。

 

         

当我们在Spring Boot应用中使用@EnableAutoConfiguration注解时,它会触发自动配置机制。

  1. 主启动类封装了@EnableAutoConfiguration注解:主启动类使用了@EnableAutoConfiguration注解,这个注解是一个组合注解,包含了多个元注解,例如@AutoConfigurationPackage@Import等。

  2. @EnableAutoConfiguration注解内部包含了@AutoConfigurationPackage注解:@AutoConfigurationPackage注解的作用是将主启动类所在的包及其子包下的所有组件(类)注册到Spring的上下文中。这样,自动配置机制就能够扫描到这些组件并进行自动配置。

  3. @EnableAutoConfiguration注解内部使用了@Import注解:通过@Import注解,@EnableAutoConfiguration注解引入了一个类,这个类实现了ImportSelector接口。

  4. 引入的类实现了ImportSelector接口并重写了selectImports方法:通过@Import注解导入的类实现了ImportSelector接口,并重写了selectImports方法。selectImports方法的作用是读取配置文件(通常是以.imports为后缀的文件),并返回一个字符串数组,其中包含了需要自动配置的类的全类名。

  5. 配置文件(.imports文件)的位置和内容:配置文件通常位于META-INF/spring.factories文件中,它是在项目的classpath下的资源目录中。这个配置文件列出了需要自动配置的类的全类名,每个类名占据一行。

  6. 根据配置类进行自动配置:根据配置文件中列出的全类名,自动配置机制会扫描并注册这些配置类。这些配置类通常由Spring Boot的起步依赖(Starter)提供,起步依赖中包含了一组预定义的配置类和依赖项。配置类中可能包含了多个Bean的定义,例如数据库连接、Web服务器等。

  7. 条件注解控制注册:在自动配置过程中,还会使用条件注解来控制是否注册某个配置类中的Bean对象。条件注解可以根据特定的条件判断是否应该注册某个Bean对象,例如某个类是否存在于Classpath中、某个属性是否被配置等。这样可以根据不同的环境和需求,仅注册符合条件的Bean。

通过以上的自动配置原理,我们能够方便地使用Spring Boot的起步依赖,无需手动配置大量的Bean对象,简化了项目的搭建和配置过程。自动配置机制使得开发者可以更专注于业务逻辑的实现,减少了重复性的配置工作,并提高了开发效率。

 总而言之就是: Spring Boot的自动配置机制通过@EnableAutoConfiguration注解和配置文件,根据预定义的配置类和条件注解,自动扫描、注册和配置Bean对象,简化了项目的搭建和配置过程。

并且配置文件中的配置类是由我们提供jar包的厂家提供的。最了解该产品的还是厂家自己,所以由厂家自己封装最合适不过。

3.代码模拟

        3.1自动配置类

@AutoConfiguration声明当前类是一个自动配置类
@Import({CommonConfig.class}):导入CommonConfig这个类,当springboot读取到这个配置类的时候就会读取到@Import这个注解,间接的就会读到了CommonConfig这个类
@AutoConfiguration
@Import({CommonConfig.class})
public class CommonAutoConfig {
    public CommonAutoConfig() {
    }
}

        3.2 配置类

这个类分别注入了,Country对象和Province对象

public class CommonConfig {
    public CommonConfig() {
    }

    @ConditionalOnProperty(
        prefix = "country",
        name = {"name", "system"}
    )
    @Bean
    public Country country(@Value("${country.name}") String name, @Value("${country.system}") String system) {
        return new Country(name, system);
    }

    @Bean
    public Province province() {
        return new Province();
    }
}

        3.3配置文件 

 

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

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

相关文章

Java基于springboot开发的景点旅游项目

演示视频 https://www.bilibili.com/video/BV1cj411Y7UK/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 主要功能:用户可浏览搜索旅游景点(分为收费和免费景点),购票(支持多规格套餐购票&am…

Unity3D实现页面的滑动切换功能

效果展示 Unity3D实现页面的滑动切换 效果 文章目录 前言一、先上代码二、创建UI1.创建Scroll View如下图,并挂载该脚本:2.Content下创建几个Itme 总结 前言 好记性不如烂笔头! 一、先上代码 /*******************************************…

堆排序--C++实现

1. 简介 堆排序利用的是堆序性,最小堆进行从大到小的排序。 先建初堆,保证堆序性。将堆顶元素与最后一个元素交换, 就将当前堆中的最大(小)的元素放到了最后后。堆大小递减,再重新调整堆选出第二大,重复上述过程。 2…

python推导式特殊用法

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 字典推导式 >>> dic {x: x**2 for x in (2, 4, 6)} >>> dic {2: 4, 4: 16, 6: 36} >>> type(dic) <class dict>集合推导式 …

VSCode 的 C/C++ 开发环境的傻瓜级自动部署程序

软件介绍 VSCode 是一款优秀的编辑器&#xff0c;可以通过各种插件&#xff0c;将其配置成 C/C 开发环境。只是对于初学者而言&#xff0c;配置步骤有点繁琐。 软件 VSCode-Setup(MinGW) 提供了自动下载安装 VSCode 并配置成 C/C 开发环境的功能。无需担心该软件会对系统有额…

JavaWeb | JavaWeb开发环境相关知识点

JavaWeb开发环境相关知识点: 1.C/S结构、B/S结构2.浏览器与服务器的交互模式3.Tomcat安装目录中&#xff0c;比较重要的文件夹/文件4.怎么修改Tomcat端口&#xff1f;5.URL /url / 统一资源定位符 1.C/S结构、B/S结构 网络应用程序中&#xff0c;有 两种基本结构&#xff1a; C…

java.io.FileNotFoundException: D:\桌面\file3 (拒绝访问。)

java.io.FileNotFoundException: D:\桌面\file3 拒绝访问。 问题描述一、问题原因及其解决办法 问题描述 今天笔者使用FileInputStream输入流的时候&#xff0c;向里面添加了&#xff08;new File(“D://桌面//file3”)的File文件参数&#xff09;&#xff0c;最后不管怎样运行…

广州华锐互动:数字孪生可视化制作软件有哪些亮点?

由广州华锐互动开发的数字孪生可视化制作软件在当今的数字孪生领域中扮演着重要角色&#xff0c;它突破了许多传统数字孪生可视化制作软件的限制。以下是几个方面的突破&#xff1a; 无限自由度&#xff1a;传统的3D建模工具通常有限制编辑器的自由度&#xff0c;使用户难以进行…

KEDA:基于事件驱动扩展K8S应用的深度实践

新钛云服已累计为您分享773篇技术干货 为什么我们要自动扩展应用程序&#xff1f; 作为 SRE&#xff0c;需要保证应用弹性和高可用性。因此&#xff0c;自动缩放是我们需要的必须功能。通过自动缩放&#xff0c;我们能确保工作负载能够高效的地处理业务流量。 在本文中&#xf…

[vmware]vmware虚拟机压缩空间清理空间

vmware中的ubuntu使用如果拷贝文件进去在删除&#xff0c;vmare镜像文件并不会减少日积月累会不断是的真实物理磁盘空间大幅度减少&#xff0c;比如我以前windows操作系统本来只有30GB最后居然占道硬盘200GB&#xff0c;清理方法有2种。 第一种&#xff1a;vmware界面操作 第二…

Dubbo篇---第二篇

系列文章目录 文章目录 系列文章目录一、注册中心挂了,consumer 还能不能调用 provider?二、怎么实现动态感知服务下线的呢?三、Dubbo 负载均衡策略?一、注册中心挂了,consumer 还能不能调用 provider? 可以。因为刚开始初始化的时候,consumer 会将需要的所有提供者的地…

多目标跟踪算法 实时检测 - opencv 深度学习 机器视觉 计算机竞赛

文章目录 0 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习多目标跟踪 …

解决Ts中的error.stack报错property ‘stack‘ does not exist on type ‘unknown typescript

我用的Ts版本是5.x&#xff0c;所以在使用的时候出现了这个问题 解决方式&#xff1a; 将error先转一遍就好了 参考链接&#xff1a; 你真的会处理TS中的Error么 - 掘金 (juejin.cn) Announcing TypeScript 4.4 - TypeScript (microsoft.com)

黑群晖安装及使用小计

最近发现4t的盘装满了&#xff0c;最主要的照片也来到了4万张大关。所以怎么处理&#xff0c;怎么定位&#xff0c;怎么更方便的查找图片就变得很重要。 第一步我选择了picturama这个软件&#xff0c;只要指定图片文件夹&#xff0c;能够很快速 的浏览&#xff0c;并且带时间轴…

Zabbix结合Grafana统计日志网站访问量

Zabbix除了可以通过HTTP代理及WEB场景监控网站的响应结果、响应时间和传输速度等&#xff0c;也可以通过读取网站的后台日志&#xff0c;获取有用的统计信息。 下面我以Grafana为例&#xff0c;通过日志统计网站的访问量。 操作如下&#xff1a; 1、读取grafana日志 首先要基…

基于单片机的商场防盗防火系统设计

收藏和点赞&#xff0c;您的关注是我创作的动力 文章目录 概要 一、系统分析二、系统总设计2.1基于单片机的商场防火防盗系统的总体功能2.2系统的组成 三 软件设计4.1软件设计思路4.2软件的实现4.2.1主控模块实物 四、 结论五、 文章目录 概要 本课题设计一种商场防火防盗报警…

Webpack的入口(entry)和出口(output)

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

C++笔记之std::pair

C笔记之std::pair code review!

java EE 进阶

java EE 主要是学框架(框架的使用,框架的原理) 框架可以说是实现了部分功能的半成品,还没装修的毛坯房,然后我们再自己打造成自己喜欢的成品 这里学习四个框架 : Spring ,Spring Boot, Spring MVC, Mybatis JavaEE 一定要多练习,才能学好 Maven 目前我们主要用的两个功能: …

堆叠注入 [GYCTF2020]Blacklist1

打开题目 判断注入点 输入1&#xff0c;页面回显 输入1 页面报错 输入 1 # 页面正常&#xff0c;说明是单引号的字符型注入 我们输入1; show databases; # 说明有6个数据库 1; show tables; # 说明有三个表 我们直接查看FlagHere的表结构 1;desc FlagHere&#xff1b;# 发…