SpringBoot是如何简化Spring开发的,以及SpringBoot的特性以及源码分析

目录

1.什么是springboot

2.配置文件的优先级

2.1  配置文件的优先级

2.2  系统配置以及命令行配置

3.Bean对象的管理

3.1  如何获取对应的bean对象

3.2  bean的作用域

3.3  声明第三方bean

@Component 及衍生注解 与 @Bean注解使用场景?

如何查看项目已有的bean对象?

4.SpringBoot原理

4.1  起步依赖

4.2  自动配置

如何将第三方依赖引入项目?

自动配置的原理,源码分析?

如何自定义starter?


一张图让你认识SSM对应的技术,Springboot简化Spring框架的开发

1.什么是springboot

Spring Boot 是一个开源的 Java 开发框架,它简化了基于 Spring 框架的应用程序的创建和部署过程。Spring Boot 构建于经典的 Spring Framework 之上,并提供了诸多开箱即用的特性,使得开发者可以更快速地创建独立的、生产级别的 Spring 应用程序。

具体来说,Spring Boot 提供了以下几个主要特点和优势:

  1. 简化配置:Spring Boot 采用约定大于配置的理念,通过自动配置(auto-configuration)来减少开发者对应用程序配置的需求。它通过分析 classpath、配置文件、注解等,自动配置 Spring 应用所需的组件。

  2. 内嵌容器:Spring Boot 内置了多种常用的 HTTP 容器(如Tomcat、Jetty),开发者可以将应用打包成一个独立的 JAR 文件,直接运行在这些内嵌容器中,无需外部部署。

  3. 起步依赖:Spring Boot 提供了一系列的“起步依赖”(Starter Dependencies),这些依赖项封装了常用的库和框架,简化了项目的依赖管理和配置。

  4. 自动化的管理:Spring Boot 提供了丰富的 Actuator 组件,可以实现应用的监控、度量和管理,例如健康检查、审计、配置查看等功能。

  5. 生态系统:Spring Boot 集成了大量的第三方库和插件,支持与各种数据库、消息队列、缓存等技术的集成,使得开发者可以轻松构建复杂的企业级应用。

总之,Spring Boot 通过简化开发流程、提升生产效率和降低学习门槛,成为了现代 Java 应用开发的首选框架之一。

2.配置文件的优先级

2.1  配置文件的优先级

如果一个springboot项目同时写了以上三个配置文件

优先级:properties > yml > yaml

注意:虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置 (yml是主流)。

2.2  系统配置以及命令行配置

SpringBoot 除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置。

优先级:命令行参数  >  java系统属性  >  配置文件

但是一般系统属性和命令行参数是项目被打包(jar包)时,运行指定的

注意:Springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin (基于官网骨架创建项目,会自动添加该插件)

3.Bean对象的管理

控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)是面向对象编程中重要的设计原则和模式,特别在Spring框架中广泛应用。

  1. 控制反转(IoC)

    • IoC 是一种软件设计原则,它反转了传统的程序设计流程。传统情况下,程序员需要在代码中显式地创建对象并管理它们的依赖关系。而IoC容器则负责管理应用程序中对象的生命周期及其依赖关系。
    • 在IoC容器中,对象的创建和依赖关系的管理被容器托管,而不是由对象自己来完成。这种控制权的反转使得程序更加灵活,解耦了组件之间的依赖关系。
  2. 依赖注入(DI)

    • DI 是实现IoC的一种方式。它是指在创建对象时,将对象所依赖的其他对象(依赖)传递给它,而不是对象自己创建或查找依赖对象。
    • 依赖注入可以通过构造函数注入、属性注入或者接口注入等方式实现。Spring框架通常使用构造函数或者属性注入的方式来实现依赖注入,以确保对象在被创建时能够获得所需的依赖对象。

在Spring框架中,控制反转和依赖注入的结合使用使得开发者能够更加专注于业务逻辑的实现,而不必关注对象的创建和依赖关系的管理,从而提高了代码的可维护性和可测试性。

类上添加什么注解就可以交给IOC管理呢?

@Component

  • 这是最基本的注解,用于将一个类标记为 Spring 容器中的一个组件。被标记为 @Component 的类会被自动检测并注册到 Spring 容器中,成为一个 Bean。

@Repository

  • @Repository 注解是 @Component 的一个特化,用于标识数据访问层的组件。它不仅将类标记为 Spring Bean,还提供了额外的功能,比如异常转换。

@Service

  • @Service 注解也是 @Component 的一个特化,用于标识服务层的组件。它用于标记业务逻辑层的类,并且可以与事务管理等功能结合使用。

@Controller

  • @Controller 注解用于标识控制器层的组件,它通常用于 Spring MVC 中的控制器类。被标记为 @Controller 的类会作为请求处理器,并能够将请求映射到相应的处理方法。

@RestController

  • @RestController 是 @Controller 和 @ResponseBody 的组合注解,用于定义 RESTful API 的控制器。它自动将方法的返回值转为 JSON 或 XML 格式的响应体。

方法如何交给IOC容器管理呢?

只需整一个配置类@Configuration,然后在其方法中加上@Bean注解

3.1  如何获取对应的bean对象

Bean对象如果没有自定义名称,默认就是类名的小驼峰式

默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:

  • 根据name获取bean:Object getBean(String name)
  • 根据类型获取bean:<T> T getBean(Class<T> requiredType)
  • 根据name获取bean(带类型转换):<T> T getBean(String name, Class<T> requiredType)

注意:上述所说的 【Spring项目启动时,会把其中的bean都创建好】还会受到作用域及延迟初始化影响,这里主要针对于 默认的单例非延迟加载的bean而言。

上述得到的是同一个bean对象,默认也是一个bean对象



3.2  bean的作用域

bean的作用域可以让bean对象实现单例和非单例

Spring支持五种作用域,后三种在web环境才生效:

注意:

  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
  • prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
  • 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

3.3  声明第三方bean

一般第三方的bean是只读不可写,因此你不能在类上加注解

这就需要通过@Bean方法注解来创建对象并且交给IOC容器来管理

这样也可以实现,然后用@Autowired注入就可以使用这个对象了

@Component 及衍生注解 与 @Bean注解使用场景?

  • 项目中自定义的,使用@Component及其衍生注解
  • 项目中引入第三方的,使用@Bean注解,因为第三方源码不给添加注解

如何查看项目已有的bean对象?

4.SpringBoot原理

4.1  起步依赖

如果基于Spring框架开发,我们引入java-web依赖需要以下四个依赖,

而且这四个依赖之间的版本要互相兼容,不然就会出现版本异常

而我们用springboot项目时,只需要引入java-web这一个起步依赖,起步依赖

还包含其他可能需要依赖的依赖,也就是maven的依赖传递

4.2  自动配置

SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。

举例:

我们并没有引入gson对应的maven依赖,但是springboot会自动帮我们配置相关的bean对象

因此这就是springboot的自动配置.

如何将第三方依赖引入项目?

把第三方依赖引入maven之后会发现,运行时项目并没有对应的第三方依赖的bean对象,

原因是springboot项目,默认扫描的是启动类的包及其子包

解决方案:

方案一:在启动类上加@ComponentScan 组件扫描

@ComponentScan({"com.example","com.itheima","com.alibaba","com.google","org.springframework","org.mybatis",...})@SpringBootApplicationpublic class SpringbootWebConfig2Application { }

这种方法有点繁琐

方案二:@Import 导入。使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:

  • 导入 普通类(也就是不需要加任何注解)
  • 导入 配置类(就是@Configuration的注解类)
  • 导入 ImportSelector 接口实现类(该类实现了ImportSelector接口)

案例:

上面两种方案都需要我们一个一个去手动引入,一般第三方会提供一个@EnableXxxx注解,

封装所有的@Import注解,因此我们只需要引入对应的@EnableXxxx注解即可

自动配置的原理,源码分析?

@SpringBootApplication启动类注解的作用?

该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。该注解由三个部分组成:  

  • @SpringBootConfiguration:该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类。  
  • @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。
  • @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。底层封装了@Import({AutoConfigurationImportSelector.class})注解

追@Import({AutoConfigurationImportSelector.class})注解源码发现,当springboot项目启动时,

就会去加载以下的文件

也就是

文件里面就定义了一系列需要的自动配置

是不是这些bean对象在springboot项目启动就一定会被创建呢?

答案:并不是,创建时机可以通过一系列@ConditionalXxx注解进行控制

@ConditionXxx注解

作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中。  

位置:方法、类  @Conditional 本身是一个父注解,派生出大量的子注解:

  •  @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。  
  • @ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称) ,才注册bean到IOC容器。  
  • @ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

案例:

@Bean
@ConditionalOnClass(name = "io.jsonwebtoken.Jwts") //当前环境存在指定的这个类时,才声明该
bean public HeaderParser headerParser(){...}
@Bean
@ConditionalOnMissingBean //当不存在当前类型(HeaderParser)的bean时,才声明该bean 
public HeaderParser headerParser(){...}

@Bean
@ConditionalOnProperty(name = "name",havingValue = "itheima") //配置文件	中存在对应的属性和值,才注册bean到IOC容器。
public HeaderParser headerParser(){...}

如何自定义starter?

使用场景:

在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot 的 starter。

编辑好对应的autoconfigure和starter之后,我们在项目中只需要引入其起步依赖,因为autoconfigure会被作为starter的依赖传递,传递下去

需求:

自定义aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具类 AliyunOSSUtils 的自动配置。 目标:引入起步依赖引入之后,要想使用阿里云OSS,注入 AliyunOSSUtils直接使用即可。

(这里实现直接使用,就需要把类上的@Component注解,想办法变成不用组件扫描就可以直接使用的方案,也就是@Configuration中定义@Bean方法,自动生成对应的bean对象放到IOC容器中)

实现:

创建 aliyun-oss-spring-boot-starter 模块

创建 aliyun-oss-spring-boot-autoconfigure  模块

1.aliyun-oss-spring-boot-starter 模块

需要引入autoconfigure  模块

2.aliyun-oss-spring-boot-autoconfigure  模块

引入第三方依赖

还需要写需要自动配置的类到springboot会去扫描的文件上

配置完成之后,其他项目需要用到该依赖,只需要引入该起步依赖即可使用

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

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

相关文章

Nginx学习-相关概念

Nginx学习-相关概念 主要学习几个概念&#xff1a;Nginx&#xff0c;正向代理、反向代理、负载均衡、动静分离。–2020年05月29日 什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。 特点是占有内存少&…

动态住宅IP和静态住宅IP主要区别是什么?

在互联网连接的世界中&#xff0c;IP地址是我们识别和访问网络资源的关键。住宅IP地址&#xff0c;特别是动态住宅IP和静态住宅IP&#xff0c;是两种不同类型的IP分配方式&#xff0c;它们在使用和功能上存在显著差异。 1. IP地址的稳定性 动态住宅IP&#xff1a;这种IP地址是…

计算机组成原理面试知识点总结1

#ウルトラマンゼット&#xff08;泽塔&#xff09; 1 计算机发展历程 1.1 计算机的硬件发展 电子管时代晶体管时代中小规模集成电路时代超大规模集成点电路时代 元件更新变化&#xff1a; 摩尔定律&#xff1a;18 个月晶体管翻一倍半导体存储器不断发展微处理器不断发展 1.2…

html+css 实现简约社交分享按钮

效果 原理解析 1.事件是由a标签的hover触发的 2.动画效果是transition动画效果 上代码&#xff0c;可以直接复制使用 目录 html <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text/html; charsetutf-8"…

环境变量配置文件中两种路径添加方式

环境变量配置文件中两种路径添加方式 文章目录 环境变量配置文件中两种路径添加方式代码示例区别和作用 代码示例 export HBASE_HOME/opt/software/hbase-2.3.5 export PATH$PATH:$HBASE_HOME/binexport SPARK_HOME/opt/software/spark-3.1.2 export PATH$SPARK_HOME/bin:$PAT…

抖音客户端一面

C | 字节抖音客户端一面 Http握手过程 1. 客户端问候(Client Hello) 客户端向服务器发送一个“问候”消息&#xff0c;其中包含客户端支持的SSL/TLS版本、加密算法、压缩方法以及一个随机数。 version 版本号,https也有版本号哦TLS 1.0、TLS 1.1、TLS 1.2等等 random 随机数…

使用API有效率地管理Dynadot域名,设置待删除域名抢注请求

简介 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

爬虫学习2:爬虫爬取网页的信息与图片的方法

爬虫爬取网页的信息与图片的方法 爬取人物信息 import requestshead {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0" } # 这是get请求带参数的模式…

了解Linux中的shell脚本

目录 1、什么是shell 2、编写第一个shell文件 3、shell的权限 4、变量 5、 shell传递参数 6、shell数组 7、shell基本运算符 7.1 算术运算符 7.2 关系运算符 7.3 布尔运算符 7.4 逻辑运算符 7.5 字符串运算符 8、控制语句 8.1 if 8.2 for 8.3 while语句 9、其他 1、…

C#初级——条件判断语句和循环语句

条件判断语句 简单的条件判断语句&#xff0c;if()里面进行条件判断&#xff0c;如果条件判断正确就执行语句块1&#xff0c;如果不符合就执行语句块2。 if (条件判断) { 语句块1 } else { 语句块2 } int age 18;if (age < 18){Console.WriteLine("未…

Anaconda安装-超详细版(2023)

Anaconda安装 - 超详细版&#xff08;2023&#xff09; 前言&#xff1a;彻底卸载pythonAnaconda下载地址安装详细步骤配置环境变量检验安装是否成功更改conda源&#xff08;后续安装第三方库可以加快速度&#xff09;超详细彻底卸载Anaconda教程Tensorflow-gpu 安装 前言&…

ORBSLAM3 ORB_SLAM3 Ubuntu20.04 ROS Noetic 虚拟机镜像 下载

下图是build.sh 和 build_ros.sh编译结果截图&#xff1a; slam数据集测试视频&#xff1a; orbslam3 ubuntu20.04 test 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nre0Y9vig5QXIGU52qCLbQ?pwd9rbi 提取码&#xff1a;9rbi

【系列教程之】1、点亮一个LED灯

1、点亮一个LED灯 作者将狼才鲸创建日期2024-07-23 CSDN教程目录地址&#xff1a;【目录】8051汇编与C语言系列教程本Gitee仓库原始地址&#xff1a;才鲸嵌入式/8051_c51_单片机从汇编到C_从Boot到应用实践教程 本源码包含C语言和汇编工程&#xff0c;能直接在电脑中通过Keil…

【iOS】内存五大分区

目录 堆&#xff08;Heap&#xff09;是什么五大分区栈区堆区全局/静态区常量区&#xff08;即.rodata&#xff09;代码区&#xff08;.text&#xff09; 函数栈堆和栈的区别和联系图解 OC语言是C语言的超集&#xff0c;所以先了解C语言的内存模型的内存管理会有很大帮助。C语言…

常识判断1

1.法律 &#xff08;1&#xff09;行政法 &#xff08;2&#xff09;刑法 3.新公务员法 &#xff08;4&#xff09;宪法 &#xff08;5&#xff09;民法 &#xff08;6&#xff09;监察法 &#xff08;7&#xff09;婚姻法 &#xff08;8&#xff09;反不正当竞争法

二次元手游《交错战线》游戏拆解

交错战线游戏拆解案 游戏亮点即核心趣味 一、关键词&#xff1a; 回合制游戏、二次元、机甲、横板、剧情、养成、异星探索。 二、游戏亮点&#xff1a; 符合目标群体审美的原画。 三、核心趣味&#xff1a; 抽卡、肝或者氪金解锁新皮肤。 核心玩法及系统规则 核心玩法&…

英特尔终于宣布了解决CPU崩溃和不稳定性问题的方法,声称过高的电压是根本原因;补丁预计将于8月中旬推出【更新】

英特尔终于宣布了解决CPU崩溃和不稳定性问题的方法&#xff0c;声称过高的电压是根本原因&#xff1b;补丁预计将于8月中旬推出【更新】 英特尔官方宣布&#xff0c;已找到困扰其CPU的崩溃问题的根本原因&#xff0c;并将于8月中旬前发布微码更新以解决这一问题&#xff0c;从而…

Godot游戏制作 02玩家1.0版

Unity大神&#xff0c;YouTube百万游戏开发者的启蒙老师&#xff0c;Brackeys&#xff0c;携 Godot 新手教程&#xff0c;正式回归。 转自&#xff1a;https://youtu.be/LOhfqjmasi0?si4RguI6-pXHZ2mk9K 资产&#xff1a;https://brackeysgames.itch.io/brackeys-platformer-b…

SpringBoot3整合Druid报错Cannot load driver class: org.h2.Driver

报错显示springboot自带的H2数据库报错&#xff0c;其实是因为druid并未加载进去。如果你其它配置都没问题的话&#xff0c;请检查druid的依赖是什么版本的&#xff0c;因为springboot3刚开始是不支持druid的。 方案一&#xff1a; 即需要手动在resources目录下创建META-INF/s…

java算法day20

java算法day20 701.二叉搜索树中的插入操作450.删除二叉搜索树中的节点108 将有序数组转换为二叉搜索树 本次的题目都是用递归函数的返回值来完成&#xff0c;多熟悉这样的用法&#xff0c;很方便。 其实我感觉&#xff0c;涉及构造二叉树的题目&#xff0c;用递归函数的返回值…