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.rhkb.cn/news/382899.html

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

相关文章

【C++】:AVL树的深度解析及其实现

目录 前言一&#xff0c;AVL树的概念二&#xff0c;AVL树节点的定义三&#xff0c;AVL树的插入3.1 第一步3.2 第二步 四&#xff0c;AVL树的旋转4.1 右单旋4.2 左单旋4.3 右左双旋4.4 左右双旋4.5 插入代码的完整实现4.6 旋转总结 五&#xff0c;AVL树的验证六&#xff0c;实现…

埃文科技受邀出席2024年河南省工业领域网络和数据安全政策宣贯会

2024年7月18日&#xff0c;由河南省工业和信息化厅主办&#xff0c;河南省工业信息安全产业发展联盟、河南省信息安全产业协会承办的2024年河南省工业领域网络和数据安全政策宣贯会在郑州召开&#xff0c;活动旨在提升河南省工业领域网络和数据安全保护能力&#xff0c;助力企业…

python模拟12306订火车票【代码示例】

实现效果&#xff1a;从给定的车次信息里选择车票&#xff0c;如果车票在车次信息里&#xff0c;系统提示填写乘车人&#xff0c;并出具购票凭据&#xff1b;如果车票不在车次里&#xff0c;提示车次不存在。 代码 # 定义一个字典&#xff0c;存储车次信息 ticket{G1569:[北京…

2023年码蹄杯专科组第一场初赛 解题报告 | 珂学家

前言 题解 有几道感觉还行&#xff0c;不过数据有些弱 安全验证&#xff08;字符串&#xff09;旅行&#xff08;图论&#xff09; 安全验证 难度: 钻石 思路: 字符串hash 二分 先提炼下题意: 即存在字符串T, 它即是S的前缀, 也是S的后缀, 同时在S[1:-2]中存在子数组ST…

刷题了:344.反转字符串|541. 反转字符串II|卡码网:54.替换数字

344.反转字符串 题目链接:https://leetcode.cn/problems/reverse-string/description/ 文章讲解:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html 视频讲解:https://www.bilibili.com/video/BV1fV4y17748/?spm_id_from333.788&vd_s…

PostgreSQL简介和安装

一、Postgresql简介&#xff1a; 1、PostgreSql是功能强大的&#xff0c;开源的关系型数据库&#xff0c;底层基于C语言实现&#xff1b; 2、开源&#xff1a;允许对PostgreSql进行封装&#xff0c;用于商业收费&#xff1b; 3、版本迭代速度快&#xff0c;正式版本已经到15.R…

Linux网络命令

文章目录 Linux网络命令1、ping 命令2、netstat命令3、pidof Linux网络命令 1、ping 命令 使用命令&#xff1a;ping [-c 次数]网址或者IP地址。可以查看当前客户端与IP的网络是否可达。 ping -c 5 www.baidu.com PING www.a.shifen.com (157.148.69.74) 56(84) bytes of data…

嵌入式代码编译过程概述

嵌入式代码编译过程概述 前言一、c/c编译过程1.1 代码编译过程1.1.1 预处理1.1.2 编译阶段1.1.3 汇编阶段1.1.4 链接阶段 1.2 编译过程中的编译工具GCC /Gclang/clangMinGW / MSVCArm GNU ToolchainarmccMAKE/CMAKE/qmake 二、常见IDE编译过程2.1 keil代码编译过程2.2 windows-…

【Hot100】LeetCode—322. 零钱兑换

目录 题目1- 思路2- 实现⭐322. 零钱兑换——题解思路 3- ACM 实现 题目 原题连接&#xff1a;322. 零钱兑换 1- 思路 思路 其中 amount 是背包容量 ——> 其中 nums 数组代表的背包重量 2- 实现 ⭐322. 零钱兑换——题解思路 class Solution {public int coinChange(in…

2023 N1CTF-n1proxy

文章目录 参考rsa握手rust_proxy源码公匙交换和签名会话钥匙后续通信生命周期和裸指针代码审计漏洞点 libc-2.27.so大致思路&#xff08;exp还有变化&#xff09;调试exp泄露libc写free_hook执行命令exp 参考 https://github.com/Nu1LCTF/n1ctf-2023/tree/main/pwn/n1proxy ht…

算法学习day19

一、通过删除字母匹配到字符字典中的最大值 给你一个字符串 s 和一个字符串数组 dictionary &#xff0c;找出并返回 dictionary 中最长的字符串&#xff0c;该字符串可以通过删除 s 中的某些字符得到。 如果答案不止一个&#xff0c;返回长度最长且字母序最小的字符串。如果…

数据库——单表查询

一、建立数据库mydb8_worker mysql> use mydb8_worker; 二、建立表 1.创建表 mysql> create table t_worker(department_id int(11) not null comment 部门号,-> worder_id int(11) primary key not null comment 职工号,-> worker_date date not null comment…

【多模态】CLIP-KD: An Empirical Study of CLIP Model Distillation

论文&#xff1a;CLIP-KD: An Empirical Study of CLIP Model Distillation 链接&#xff1a;https://arxiv.org/pdf/2307.12732 CVPR 2024 Introduction Motivation&#xff1a;使用大的Teacher CLIP模型有监督蒸馏小CLIP模型&#xff0c;出发点基于在资源受限的应用中&…

CTF-NSSCTF题单[GKCTF2020]

[GKCTF 2020]CheckIN 这道题目考察&#xff1a;php7-gc-bypass漏洞 打开这道题目&#xff0c;开始以为考察反序列化&#xff0c;但实际并不是&#xff0c;这里直接用$_REQUEST传入了参数便可以利用了。这里出现了一个eval&#xff08;&#xff09;函数&#xff0c;猜测考察命…

spring部分源码分析及Bean的生命周期理解

前言&#xff1a; 本文整体框架是通过refresh方法这个入口进入分析&#xff1a;分析IOC容器的创建及一些Bean的生命周期的知识点&#xff0c;写得确实一般般&#xff0c;感觉自己的有些前置知识并没有理解的很到位&#xff0c;所以&#xff0c;这篇文件先记录一下&#xff0c;…

MAT使用

概念 Shallow heap & Retained Heap Shallow Heap就是对象本身占用内存的大小。 Retained Heap就是当前对象被GC后&#xff0c;从Heap上总共能释放掉的内存(表示如果一个对象被释放掉&#xff0c;那会因为该对象的释放而减少引用进而被释放的所有的对象&#xff08;包括…

CentOS 8中 更新或下载时报错:为仓库 ‘appstream‘ 下载元数据失败 : Cannot prepare internal mirrorlist

一、错误重现 CentOS Stream 8 - AppStream 0.0 B/s | 0 B 00:00 Errors during downloading metadata for repository appstream: - Curl error (6): Couldnt resolve host name for http://mirrorlis…

docker tomcat 404

HTTP 404状态码表示“Not Found”&#xff0c;即服务器无法找到请求的页面。 当用户尝试访问一个不存在的网页时&#xff0c;服务器会返回这个状态码。这个状态码是HTTP协议的一部分&#xff0c;用于告知客户端&#xff08;通常是浏览器&#xff09;服务器无法完成请求。404状…

设计模式13-单件模式

设计模式13-单件模式 写在前面对象性能模式典型模式1. 单例模式&#xff08;Singleton Pattern&#xff09;2. 享元模式&#xff08;Flyweight Pattern&#xff09;3. 原型模式&#xff08;Prototype Pattern&#xff09;4. 对象池模式&#xff08;Object Pool Pattern&#xf…