【Java Web】014 -- SpringBoot原理(配置优先级、Bean管理、SpringBoot原理)

news2025/6/14 14:22:52

目录

一、配置优先级

1、配置(3种:.properties、yml、yaml)

①、配置文件优先级

②、如何指定Java系统属性和命令行参数

③、5种配置文件的优先级

二、Bean管理

1、获取bean(3种方法)

2、bean作用域(5种)

①、@Scope注解:配置作用域

3、第三方bean

①、在启动类中声明第三方bean:(以Dom4j:解析XML文件对象为例)

②、声明配置类来管理第三方bean对象

③、如何在配置类中的第三方bean中引入方法对象

④、思考:@Component及衍生注解 与 @Bean注解使用场景?

三、SpringBoot原理

1、起步依赖

2、自动配置

①、什么是自动配置?

②、自动配置常见方案1 —— @ComponentScan 组件扫描(不推荐)

③、自动配置常见方案2 —— @Import导入(普通类/配置类/ImportSelector接口实现类)

④、自动配置原理 -- 源码跟踪

⑤、自动配置原理 -- 条件装配注解(@Conditional)

⑥、自动配置原理 —— 小结

⑦、案例(自定义starter)

四、Web后端开发总结

1、三层架构


一、配置优先级

1、配置(3种:.properties、yml、yaml)

①、配置文件优先级

优先级最高的是(.properties > .yml > .yaml

②、如何指定Java系统属性和命令行参数

program arguments 优先级比 VM options 要高

命令行执行:

示例:

Ⅰ、正常运行一个 jar 包:

运行结果:

Ⅱ、指定Java系统属性和命令行参数:

③、5种配置文件的优先级

二、Bean管理

1、获取bean(3种方法)

默认情况下,SpringBoot项目在启动的时候会自动的创建IOC容器(也称为Spring容器),并且在启动的过程当中会自动的将bean对象都创建好,存放在IOC容器当中。应用程序在运行时需要依赖什么bean对象,就直接进行依赖注入就可以了。

代码示例:(3种获得bean对象的方法)

运行结果:(但现在我们获取的bean对象是同一个,是单例的,我们可以通过某些方法将它设置为非单例的)

2、bean作用域(5种)

单例和多例取决于作用域

注意事项:

①、@Scope注解:配置作用域

测试代码:

Ⅰ、默认情况下:(单例)

Ⅱ、懒加载:

给DeptController类加上@Lazy注解,让其进行懒加载,即:不让Spring在程序启动时就实例化bean对象,而是在我们第一次请求它们时再创建:

测试结果:程序启动时,bean对象并没有被创建

当依次使用这个bean对象时,这个对象才进行实例化:

Ⅲ、加上作用域@Scope("prototype"):表示每次使用bean时,都会创建新的实例

DeptController:

测试结果:

3、第三方bean

以上bean对象以外的bean

注意事项:

①、在启动类中声明第三方bean:(以Dom4j:解析XML文件对象为例)

示例:

在启动类中声明第三方bean:(不建议使用这种方法

②、声明配置类来管理第三方bean对象

配置类示例:

其次,我们可以通过@Bean注解的name/value属性来指定

bean的名称,如果未指定,默认是方法名:

测试bean对象的名称是否为方法名:

测试结果:

③、如何在配置类中的第三方bean中引入方法对象

直接作为形参引入:

④、思考:@Component及衍生注解 与 @Bean注解使用场景?

三、SpringBoot原理

1、起步依赖

假如我们没有使用SpringBoot,用的是Spring框架进行web程序的开发,此时我们就需要引入web程序开发所需要的一些依赖。

spring-webmvc依赖:这是Spring框架进行web程序开发所需要的依赖

servlet-api依赖:Servlet基础依赖

jackson-databind依赖:JSON处理工具包

如果要使用AOP,还需要引入aop依赖、aspect依赖

项目中所引入的这些依赖,还需要保证版本匹配,否则就可能会出现版本冲突问题。

如果我们使用了SpringBoot,就不需要像上面这么繁琐的引入依赖了。我们只需要引入一个依赖就可以了,那就是web开发的起步依赖:springboot-starter-web

起步依赖的原理就是依赖传递

2、自动配置

①、什么是自动配置?

示例:注入Gson对象

注入Gson对象:

Ⅰ、编写测试类(AutoConfigurationTests),并在其中自动注入Gson对象:

Ⅱ、运行结果:

 

问题:在当前项目中我们并没有声明谷歌提供的Gson这么一个bean对象,然后我们却可以通过@Autowired从Spring容器中注入bean对象,那么这个bean对象怎么来的?

答案:SpringBoot项目在启动时通过自动配置完成了bean对象的创建

我们知道了什么是自动配置之后,接下来我们就要来剖析自动配置的原理。解析自动配置的原理就是分析在 SpringBoot项目当中,我们引入对应的依赖之后,是如何将依赖jar包当中所提供的bean以及配置类直接加载到当前项目的SpringIOC容器当中的。

②、自动配置常见方案1 —— @ComponentScan 组件扫描(不推荐)

示例:

单元测试:获取itheima-utils中的bean以及配置类:

运行结果:

③、自动配置常见方案2 —— @Import导入(普通类/配置类/ImportSelector接口实现类)

示例:

Ⅰ、在启动类中导入 普通类

Ⅱ、在启动类中导入 配置:(多个Bean)

Ⅲ、在启动类中导入 ImportSelector 接口实现类:

ImportSelector 接口实现类:

启动类导入:

Ⅳ、@EnableXxxx注解,封装了@Import注解(推荐)

让第三方依赖自己来指定要导入哪些bean和配置类

在启动类上加上对应注解:

④、自动配置原理 -- 源码跟踪

@interface SpringBootApplication

@SpringBootConfiguration注解上使用了@Configuration表明SpringBoot启动类就是一个配置类

@Indexed注解,是用来加速应用启动的(不用关心)。

@interface EnableAutoConfiguratiion

⑤、自动配置原理 -- 条件装配注解(@Conditional)

示例:

@ConditionalOnClass:判断环境中是否有对应的字节码文件,才注册bean到IOC容器

@ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称),才注册bean到IOC容器(该注解的应用场景,通常是用来设置一个默认的bean对象)

@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器中

@Conditional小结

⑥、自动配置原理 —— 小结

自动配置的核心就在@SpringBootApplication注解上,SpringBootApplication这个注解底层包含了3个注解,分别是:

- @SpringBootConfiguration

- @ComponentScan

- @EnableAutoConfiguration

@EnableAutoConfiguration这个注解才是自动配置的核心。

  • 它封装了一个@Import注解,Import注解里面指定了一个ImportSelector接口的实现类。
  • 在这个实现类中,重写了ImportSelector接口中的selectImports()方法。
  • 而selectImports()方法中会去读取两份配置文件,并将配置文件中定义的配置类做为selectImports()方法的返回值返回,返回值代表的就是需要将哪些类交给Spring的IOC容器进行管理。
  • 那么所有自动配置类的中声明的bean都会加载到Spring的IOC容器中吗? 其实并不会,因为这些配置类中在声明bean时,通常都会添加@Conditional开头的注解,这个注解就是进行条件装配。而Spring会根据Conditional注解有选择性的进行bean的创建。

  • @Enable 开头的注解底层,它就封装了一个注解 import 注解,它里面指定了一个类,是 ImportSelector 接口的实现类。在实现类当中,我们需要去实现 ImportSelector  接口当中的一个方法 selectImports 这个方法。这个方法的返回值代表的就是我需要将哪些类交给 spring 的 IOC容器进行管理。
  • 此时它会去读取两份配置文件,一份儿是 spring.factories,另外一份儿是 autoConfiguration.imports。而在  autoConfiguration.imports 这份儿文件当中,它就会去配置大量的自动配置的类。
  • 而前面我们也提到过这些所有的自动配置类当中,所有的 bean都会加载到 spring 的 IOC 容器当中吗?其实并不会,因为这些配置类当中,在声明 bean 的时候,通常会加上这么一类@Conditional 开头的注解。这个注解就是进行条件装配。所以SpringBoot非常的智能,它会根据 @Conditional 注解来进行条件装配。只有条件成立,它才会声明这个bean,才会将这个 bean 交给 IOC 容器管理。

⑦、案例(自定义starter)

业务场景:

业务场景:

  • 我们前面案例当中所使用的阿里云OSS对象存储服务,现在阿里云的官方是没有给我们提供对应的起步依赖的,这个时候使用起来就会比较繁琐,我们需要引入对应的依赖。我们还需要在配置文件当中进行配置,还需要基于官方SDK示例来改造对应的工具类,我们在项目当中才可以进行使用。
  • 大家想在我们当前项目当中使用了阿里云OSS,我们需要进行这么多步的操作。在别的项目组当中要想使用阿里云OSS,是不是也需要进行这么多步的操作,所以这个时候我们就可以自定义一些公共组件,在这些公共组件当中,我就可以提前把需要配置的bean都提前配置好。将来在项目当中,我要想使用这个技术,我直接将组件对应的坐标直接引入进来,就已经自动配置好了,就可以直接使用了。我们也可以把公共组件提供给别的项目组进行使用,这样就可以大大的简化我们的开发。

实现步骤:

Ⅰ、创建aliyun-oss-spring-boot-starter模块:

  • 文件结构:

 由于aliyun-oss-spring-boot-starter模块只做依赖管理,所以其它文件就都可以删掉

  • pom.xml:

Ⅱ、创建aliyun-oss-spring-boot-autoconfigure模块,在starter中引入该模块

  • 文件结构:

  • pom.xml:

  • 在starter中引入autoconfigure模块:

Ⅲ、在aliyun-oss-spring-boot-autoconfigure模块中定义自动配置功能,并定义自动配置文件 META-INF/spring/xxxx.imports

  • 在autoconfigure模块中的pom.xml文件引入阿里云OSS的依赖:

  • 将相关工具类也引入autoconfigure模块(如果有报错,需要自行修改)

  • 定义自动配置类(AliOSSAutoConfiguration):

  • 定义自动配置文件 META-INF/spring/xxxx.imports:

Ⅳ、功能测试:

  • 配置文件(application.yml)

  • 测试方法:

  • Postman测试:

四、Web后端开发总结

1、三层架构

web后端开发现在基本上都是基于标准的三层架构进行开发的,在三层架构当中,Controller控制器层负责接收请求响应数据,Service业务层负责具体的业务逻辑处理,而Dao数据访问层也叫持久层,就是用来处理数据访问操作的,来完成数据库当中数据的增删改查操作。

在三层架构当中,前端发起请求首先会到达Controller(不进行逻辑处理),然后Controller会直接调用Service 进行逻辑处理, Service再调用Dao完成数据访问操作。

如果我们在执行具体的业务处理之前,需要去做一些通用的业务处理,比如:我们要进行统一的登录校验,我们要进行统一的字符编码等这些操作时,我们就可以借助于Javaweb当中三大组件之一的过滤器Filter或者是Spring当中提供的拦截器Interceptor来实现。

而为了实现三层架构层与层之间的解耦,我们学习了Spring框架当中的第一大核心:IOC控制反转与DI依赖注入

所谓控制反转,指的是将对象创建的控制权由应用程序自身交给外部容器,这个容器就是我们常说的IOC容器或Spring容器。

而DI依赖注入指的是容器为程序提供运行时所需要的资源。

除了IOC与DI我们还讲到了AOP面向切面编程,还有Spring中的事务管理、全局异常处理器,以及传递会话技术Cookie、Session以及新的会话跟踪解决方案JWT令牌,阿里云OSS对象存储服务,以及通过Mybatis持久层架构操作数据库等技术。

我们在学习这些web后端开发技术的时候,我们都是基于主流的SpringBoot进行整合使用的。而SpringBoot又是用来简化开发,提高开发效率的。像过滤器、拦截器、IOC、DI、AOP、事务管理等这些技术到底是哪个框架提供的核心功能?

  • Filter过滤器、Cookie、 Session这些都是传统的JavaWeb提供的技术。
  • JWT令牌、阿里云OSS对象存储服务,是现在企业项目中常见的一些解决方案。
  • IOC控制反转、DI依赖注入、AOP面向切面编程、事务管理、全局异常处理、拦截器等,这些技术都是 Spring Framework框架当中提供的核心功能。
  • Mybatis就是一个持久层的框架,是用来操作数据库的。

在Spring框架的生态中,对web程序开发提供了很好的支持,如:全局异常处理器、拦截器这些都是Spring框架中web开发模块所提供的功能,而Spring框架的web开发模块,我们也称为:SpringMVC

SpringMVC不是一个单独的框架,它是Spring框架的一部分,是Spring框架中的web开发模块,是用来简化原始的Servlet程序开发的。

外界俗称的SSM,就是由:SpringMVC、Spring Framework、Mybatis三块组成。

基于传统的SSM框架进行整合开发项目会比较繁琐,而且效率也比较低,所以在现在的企业项目开发当中,基本上都是直接基于SpringBoot整合SSM进行项目开发的。

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

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

相关文章

Arduino开发之如何连接超声波模块?

文章目录0、引言1、超声波模块说明2、代码编写3、功能演示0、引言 在利用Arduino开发过程中,若需知道设备与周围环境的距离,可利用超声波模块测量短程距离,使运动设备感知周围环境。本文在【Arduino如何进行开发?】基础上&#xf…

探索树形数据结构,通识树、森林与二叉树的基础知识(专有名词),进一步利用顺序表和链表表示、遍历和线索树形结构

树与二叉树 1.树 1.树形结构(非线性结构) 结点之间有分支,具有层次关系 树的定义: 树(tree)是n(n≥0)个有限集。 若n 0,则称为空树; 若n > 0,则它满足如下两个条件: 有且仅有一个特定的称为根(Ro…

NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032

然后首先我们来看一下hdfs中的数据的格式可以看到,还是json的格式对吧 而且也没有回行 然后我们来操作,首先添加一个evaluateJsonPath处理器 可以看到找到这个处理器 添加以后,我们去配置 ​​​​​​​ 点击去配置evaluateJsonPath处理器 可以看到首先我们destination这里配…

Rancher部署K8s集群

一、集群配置 服务器CPU内存磁盘操作系统k8s-master16核16G60GCentOS Linux release 7.5.1804k8s-node-116核16G60GCentOS Linux release 7.5.1804k8s-node-216核16G60GCentOS Linux release 7.5.1804 Rancher version : 2.6.3 二、环境初始化 所有服务器均执行一遍 1、将…

如何在矩池云上部署 Carla,模拟自动驾驶

简介 Carla 是一款基于 Python 编写和 UE(虚幻引擎)的开源仿真器,用于模拟自动驾驶车辆在不同场景下的行为和决策。它提供了高度可定制和可扩展的驾驶环境,包括城市、高速公路和农村道路等。Carla 还提供了丰富的 API 和工具&…

vscode中的配置

首先,运行或调试某文件,需要该文件是活动文件(当前打开的文件)。 下面依次介绍tasks.json和launch.json的配置参数。 tasks.json 1.tasks.json的用途 用于指定编译器和链接文件等。默认路径在.vscode下面。 2.如何打开一个tas…

springboot+Mybatis项目搭建教学(controller、service、dao、entity),并写一个简单的接口

创建一个springboot的项目 首先我们需要新建一个文件夹对吧,这里就不展示了,然后我们用IDEA打开这个文件夹,是这样的 新建一个模块 然后按照这里的进行选择 模块名字是自己随便起的,命名在这里时无关紧要的,然后我…

Python实现Imagenet数据集的合并和拆分

Python实现Imagenet数据集的合并和拆分 1. 合并Imagenet 任务需求 文件夹形式为一个数据集MyImagenet,路径为/home/lihuanyu/code/03AdaBins/img_data/MyImagenet/val,val文件夹又有若干的类别子文件夹,子文件夹是每一个类别的图片&#xf…

数据结构_第十一关:二叉树的链式结构

目录 1.二叉树链式结构的实现 1.1前置说明 1.2二叉树的遍历 1.3二叉树遍历的实现: 1)先序遍历、中序遍历、后续遍历代码如下 2)层序遍历: 1.4结点个数以及高度的计算 1)求二叉树的总节点: 2&#…

阿里张勇:所有行业都值得用大模型重新做一遍!

‍数据智能产业创新服务媒体——聚焦数智 改变商业“2023阿里云峰会”于4月11日在北京国际会议中心隆重召开,本次峰会以" 与实俱进 为创新提速!"为主题,阿里巴巴集团董事会主席兼首席执行官张勇、阿里云智能集团首席技术官周靖人、…

Python机器学习:适合新手的8个项

再多的理论也不能代替动手实践。教科书和课程会让你误以为精通,因为材料就在你面前。但当你尝试去应用它时,可能会发现它比看起来更难。而「项目」可帮助你快速提高应用的 ML 技能,同时让你有机会探索有趣的主题。此外,你可以将项…

java mysql高校教学成果管理系统dzkfY3程序

1.用户管理模块: 该模块包括注册用户管理和系统用户管理,系统用户主要是普通管理员,对用户信息进行管理,只有注册用户才可在该系统上进行相应的操作。用户对个人信息可进行修改;管理员可对自己的个人信息进行维护&…

Java线程系列详解

一,基本概念 进程: 程序是计算机指令的集合,它以文件形式存储在磁盘上,而进程就是一个执行中的程序,而每一个进程都有其独立的内存空间和系统资源。线程: 线程运行在进程中,不能独立存在。线程…

2019年 团体程序设计天梯赛——题解集

前言: Hello各位童学大家好!😊😊,茫茫题海你我相遇即是缘分呐,或许日复一日的刷题已经让你感到疲惫甚至厌倦了,但是我们真的真的已经达到了我们自身极限了吗?少一点自我感动&#xf…

城乡供水一体化信息化系统-城乡供水一体化

建设方案 城乡供水一体化信息化系统是运用云计算、大数据等信息化手段,借助在线监测设备,并依托“供水信息化平台”,实时感知供水系统的运行状态,实现对农村供水工程远程监控、在线监测、实时预警、智慧监管。 系统功能 水源地监测…

【 初识 Spring MVC 程序开发 】

文章目录一、什么是 Spring MVC二、什么是 MVC三、MVC 和 Spring MVC 的关系四、为什么要学 Spring MVC五、怎么学 Spring MVC六、Spring MVC 创建和连接一、什么是 Spring MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框…

搜索算法(一) 深度优先搜索 dfs

一、搜索算法 包括深度优先搜索算法和广度优先搜索算法,用于树或图等结构中进行搜索。 二、深度优先搜索 深度优先算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源…

全网最详细,Jmeter性能测试-性能基础详解,终成测试卷王(一)

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 发起请求 发起HTTP…

电脑自动录屏软件哪个好用 电脑自动录屏怎么设置

录屏是很多工作都需要进行的操作,很多会议、培训课程、PPT等都可能需要通过屏幕录制的方式来进行分享。但是目前市面上的录屏软件很多,想找到使用便捷且高效的软件并不容易。今天就来分享一下电脑自动录屏软件哪个好用,电脑自动录屏怎么设置。…

条码控件Aspose.BarCode入门教程(5):用Java 生成和扫描二维码

Aspose.BarCode for .NET 是一个功能强大的API,可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能,以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…