Web day11 SpringBoot原理

news2024/12/16 1:47:15

目录

1.配置优先级:

2.Bean的管理:

bean的作用域:

第三方bean:

方案一:

方案二:

SpringBoot原理:

扫描第三方包:

方案1:@ComponentScan 组件扫描

方案2:@Import 导入(使用@Import导入的类会被Spring加载到IOC容器中)

1). 使用@Import导入普通类:

2). 使用@Import导入配置类:

3). 使用@Import导入ImportSelector接口实现类:

4). 使用第三方依赖提供的 @EnableXxxxx注解

自定义启动器starter:

1.自定义 aliyun-oos-spring-boot-starter 模块(起步依赖)

2.创建aliyun-oss-spring-boot-autoconfigure 自动配置模块


1.配置优先级:

在我们前面的课程当中,我们已经讲解了SpringBoot项目当中支持的三类配置文件:

  • application.properties

  • application.yml

  • application.yaml

配置文件优先级排名(从高到低):

  1. properties配置文件

  2. yml配置文件

  3. yaml配置文件

五种配置方式的优先级: 命令行参数 > 系统属性参数 > properties参数 > yml参数 > yaml参数

2.Bean的管理:

bean的作用域:

在前面我们提到的IOC容器当中,默认bean对象是单例的 (只有一个实例对象)。在Spring中支持五种作用域,后三种在web环境才生效:

                                                                             

  • 可以借助Spring中的@Scope注解来进行配置作用域

//默认bean的作用域为:singleton (单例)
@RestController
@RequestMapping("/depts")
public class DeptController {

    @Autowired
    private DeptService deptService;

    public DeptController(){
        System.out.println("DeptController constructor ....");
    }

    //省略其他代码...
}

测试类:

@SpringBootTest
class SpringbootWebConfig2ApplicationTests {

    @Autowired
    private ApplicationContext applicationContext; //IOC容器对象

    //bean的作用域
    @Test
    public void testScope(){
        for (int i = 0; i < 10; i++) {
            DeptController deptController = applicationContext.getBean(DeptController.class);
            System.out.println(deptController);
        }
    }
}

                                                                                                               

ApplicationContext applicationContext; //为IOC容器对象  可以拿到IOC 容器中的bean对象

重启SpringBoot服务,运行测试方法,查看控制台打印的日志:

可以看到bean的作用域默认singleton 单例 容器中只会有一个bean对象

  • 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)  在第一次使用时才会创建bean对象

第三方bean:

在我们项目开发当中,当这个类它不是我们自己编写的,而是我们引入的第三方依赖当中提供的,那么此时我们是无法使用 @Component 及其衍生注解来声明bean的,此时就需要使用@Bean注解来声明bean 了。

因为第三方的类无法加@Component 被 spring项目扫描(默认只扫描启动类所在的包及其子包)

把第三方类对象放入 IOC容器:

方案一:

在启动类定义方法 返回的对象就会自动变为bean对象(切入到启动类不建议)

方案二:


1.在类上定义 @Configuration 注解 

2.在方法上加入@Bean注解 返回的对象会自动变成bean对象

单独在conf包下定义配置类 

  • 通过@Bean注解的name 或 value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。

  • 如果第三方bean需要依赖其他bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。

SpringBoot原理:

SpringBoot框架之所以使用起来更简单更快捷,是因为SpringBoot框架底层提供了两个非常重要的功能:一个是起步依赖,一个是自动配置

起步依赖:

springboot-starter-web,这是web开发的起步依赖,在web开发的起步依赖当中,就集成了web开发中常见的依赖:json、web、webmvc、tomcat等。我们只需要引入这一个起步依赖,其他的依赖都会自动的通过Maven的依赖传递进来。

自动配置:

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

我们在我们整个项目中,也并未配置Gson这个类型的bean,为什么可以直接注入使用呢? 原因就是因为这个bean,springboot中已经帮我们自动配置完毕了,我们是可以直接使用的。 

扫描第三方包:

如果 不在启动类所在的包及其子包的 包中的类也想被 IOC 容器 管理 @bean只针对一个对象 

扫描别的包可以把别的包中@Component 类交给IOC管理

  • 方案1:@ComponentScan 组件扫描

@SpringBootApplication
@ComponentScan({"com.itheima","com.example"}) //指定要扫描的包
public class SpringbootWebConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfigApplication.class, args);
    }
}

在启动类加入@ComponentScan 注解可以自动扫描 别的包中的@Component注解加入IOC容器

我们进行项目开发时,当需要引入大量的第三方的依赖,就需要在启动类上配置N多要扫描的包,这种方式会很繁琐。而且这种大面积的扫描性能也比较低。

缺点:

  1. 使用繁琐

  2. 性能低

结论:SpringBoot中并没有采用以上这种方案。

方案2:@Import 导入(使用@Import导入的类会被Spring加载到IOC容器中)

  • 入形式主要有以下几种:

    • 导入普通类

    • 导入配置类

    • 导入ImportSelector接口实现类

首先要把想要使用模块的 依赖 导入到spring项目模块中 才能找到对应的包

1). 使用@Import导入普通类:

@Import(TokenParser.class) //导入的类会被Spring加载到IOC容器中
@SpringBootApplication
public class SpringbootWebConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfigApplication.class, args);
    }
}

不用写@Component注解 类对象会被直接导入

2). 使用@Import导入配置类:

用配置类可以把多个bean对象一次放入IOC容器中

配置类:

启动类:

 导入配置类IOC容器中会有 配置类对象 和 配置类中的两个bean对象

3). 使用@Import导入ImportSelector接口实现类:

ImportSelector接口实现类

public class MyImportSelector implements ImportSelector {
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        //返回值字符串数组(数组中封装了全限定名称的类)
        return new String[]{"com.example.HeaderConfig"};
    }
}

  启动类

@Import(MyImportSelector.class) //导入ImportSelector接口实现类
@SpringBootApplication
public class SpringbootWebConfig2Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }
}

以上三种方法 都i需要在启动类自己@Import 类 但是我们一般并不清楚 第三方类的名字 

  • 比较常见的方案就是第三方依赖给我们提供一个注解,这个注解一般都以@EnableXxxx开头的注解,注解中封装的就是@Import注解

4). 使用第三方依赖提供的 @EnableXxxxx注解

  • 第三方依赖中提供的注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)//指定要导入哪些bean对象或配置类
public @interface EnableHeaderConfig { 
}

  • 在使用时只需在启动类上加上@EnableXxxxx注解即可

@EnableHeaderConfig  //使用第三方依赖提供的Enable开头的注解
@SpringBootApplication
public class SpringbootWebConfig2Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfig2Application.class, args);
    }
}

自动配置原理源码入口就是 @SpringBootApplication 注解,在这个注解中封装了3个注解,分别是:

  • @SpringBootConfiguration

    • 声明当前类是一个配置类

  • @ComponentScan

    • 进行组件扫描(SpringBoot中默认扫描的是启动类所在的当前包及其子包)

  • @EnableAutoConfiguration

  • 封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)

      在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-
  • INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。

    • 封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)

当SpringBoot程序启动时,就会加载配置文件当中所定义的配置类,并将这些配置类信息(类的全限定名)封装到String类型的数组中,最终通过@Import注解将这些配置类全部加载到Spring的IOC容器中,交给IOC容器管理。

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中定义的配置类非常多,而且每个配置类中又可以定义很多的bean,那这些bean都会注册到Spring的IOC容器中吗?

答案:并不是。 在声明bean对象时,上面有加一个以 @Conditional 开头的注解,这种注解的作用就是按照条件进行装配,只有满足条件之后,才会将bean注册到Spring的IOC容器中(下面会详细来讲解)

自定义启动器starter:

目的:将阿里云util 文件上传类对象 自动放到 IOC 容器中 可以直接注入使用

否则 在 不同项目中都需要重新写util类 

只需要引入启动器依赖即可

springboot的启动器 默认会 读取 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

文件中的配置类 并把配置类 中的 bean 对象加载到IOC容器中

我们只需要定义相同的路径 把我们 自己的配置类放到 .imports 文件中即可

·

1.自定义 aliyun-oos-spring-boot-starter 模块(起步依赖)

只需要有pom 文件即可 

在pom 文件中 只需要引入 自动配置模块的依赖

 

2.创建aliyun-oss-spring-boot-autoconfigure 自动配置模块

                                     

EnableAutoConfigureAliyunOSS为util 的配置类

@Configuration // 声明为配置类:实现自动配置
public class EnableAutoConfigureAliyunOSS {

    // 把阿里云的OSS文件上传对象交给spring容器管理。
    // 阿里云对象需要配置信息对象的
    // 阿里云的属性对象可以注入给文件上传对象。
    @Bean
    public OSSFileUpholdUtil ossFileUploadUtil() {
        return new OSSFileUpholdUtil();
    }
}

                                                 

在 .import 文件中写入 配置类的路径 springboot自动配置时就会自动添加bean

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

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

相关文章

ECharts柱状图-柱图2,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

VMware安装ubuntu22教程

文章目录 软件环境1、打开vmware&#xff0c;选择创建新的虚拟机2、选典型安装&#xff0c;然后点击下一步3、选择稍后安装操作系统&#xff0c;点击下一步4、版本选择Ubuntu 64位&#xff0c;点击下一步5、输入虚拟机名称和规划的安装盘符路径6、最大磁盘大小选择20G&#xff…

利用usb-cam包标定RealSense D435相机(未解决版)

一、 安装usb-cam包和标定数据包 usb_cam 包的主要作用是将 USB 摄像头的视频流转换为 ROS 可用的消息格式。 sudo apt-get install ros-melodic-usb-cam camera_calibration 包是 ROS 中用于相机标定的工具包&#xff0c;主要用于校准相机的内参和外参。 sudo apt-get ins…

Kafka系列教程 - Kafka 生产者 -2

1. 生产者简介 不管是把 Kafka 作为消息队列系统、还是数据存储平台&#xff0c;总是需要一个可以向 Kafka 写入数据的生产者和一个可以从 Kafka 读取数据的消费者&#xff0c;或者是一个兼具两种角色的应用程序。 使用 Kafka 的场景很多&#xff0c;诉求也各有不同&#xff…

基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源

前言 对于本教程&#xff0c;说白了&#xff0c;就是期望能通过一个程序判断一张图片是否为某个物体&#xff0c;或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题&#xff0c;因此主要处理 是 与 不是 的问题&#xff0c;比如我的模型是判断一张图片是否为苹果…

SpringBoot集成JWT和Redis实现鉴权登录功能

目前市面上有许多鉴权框架&#xff0c;鉴权原理大同小异&#xff0c;本文简单介绍下利用JWT和Redis实现鉴权功能&#xff0c;算是抛砖引玉吧。 主要原理就是“令牌主动失效机制”&#xff0c;主要包括以下4个步骤&#xff1a; (1)利用拦截器LoginInterceptor实现所有接口登录拦…

初识Robot Framework测试框架

Robot Framework 是一款用 Python 编写的通用型测试框架&#xff0c;具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端&#xff08;Web、PC、移动端&#xff09;或者接口&#xff0c;也可以进行分布式测试执行。常用于验收测试和验收测试…

Windows安装elasticsearch、Kibana以及IK分词器

一、下载 1.下载elasticsearch 访问官网Download Elasticsearch | Elastic&#xff0c;下载elasticsearch 2.下载 Kibana 访问Download Kibana Free | Get Started Now | Elastic &#xff0c;下载 Kibana 3. IK分词器下载 访问Gitee 极速下载/elasticsearch-analysis-ik选…

socket编程UDP-实现停等机制(接收确认、超时重传)

在下面博客中&#xff0c;我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程&#xff0c;并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接&#xff08;进阶篇&#xff09;_udp socket发送-CSDN博客 下面博客实现的是滑动窗口机制&#xff1a; sock…

PHP项目从 php5.3 版本升级到 php8.3 版本时的一些问题和解决方法记录

一个原来的项目&#xff0c;因为业务需要&#xff0c;进行了PHP版本升级&#xff0c;从php5.3直接升级到php8.3。变化挺大的&#xff0c;原程序中有很多不再兼容&#xff0c;在此处进行一下记录。 一、Deprecated: 显式转换问题 报错内容&#xff1a;Deprecated: Implicit con…

在Liunx中安装JDK、Tomcat、mysql、lrzsz、Nginx

一.软件安装方式 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 二.安装JDK 上述我们介绍了Linux系统软件安装的四种形式&#xff0c;接下来我们就通过第一种(二进制发 布包)形式来安装JDK。 在/下创建soft目录&…

LeetCode-hot100-73

https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envTypestudy-plan-v2&envIdtop-100-liked 84. 柱状图中最大的矩形 已解答 困难 相关标签 相关企业 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#x…

leetcode-73.矩阵置零-day5

class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …

【Spark】Spark Join类型及Join实现方式

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…

开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力

在当今竞争激烈的商业环境中&#xff0c;私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性&#xff0c;从多个维度为私域流量运营提供了强有力的支持与推动&#xff0c;以下将详细阐述其在各个方面的…

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…

Phoenix5.1.3安装

环境说明 准备三台服务器&#xff0c;分别为&#xff1a;bigdata141&#xff08;作为HBase主节点&#xff09;、bigdata142、bigdata143&#xff0c;已经搭建好HBase集群&#xff0c;我这边HBase版本为2.2.7另准备一台服务器&#xff0c;bigdata144&#xff0c;作为Phoenix客户…

ASP.NET Core API + MySql

环境 数据库&#xff1a; mysql8.0 后端&#xff1a; vs2022 ASP.NET Core API .net 8 前端&#xff1a; Hbuilderx bootstrap 5.3.0 jquery v3.7.1 bootstrap-table 1.23.5 创建项目 添加资源包 AutoMapper Microsoft.EntityFrameworkCore.Tools 8.0.0 Pomelo.EntityFramew…

小程序维护外包流程和费用

由于某些原因很多老板想要跟换掉小程序原来合作的开发公司&#xff0c;重新把小程序系统维护外包新的公司。小程序系统外包维护是一个涉及多个方面的过程&#xff0c;需要从需求明确、选择团队到持续优化等多个环节进行细致管理。以下就是小程序系统外包维护主要包括几个关键步…

代码随想录算法训练营第三十二天|动态规划理论基础|LC509.肥波那些数|LC70.爬楼梯|LC746.使用最小花费爬楼梯

动态规划理论基础 解释&#xff1a;动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff1b;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 动态规划五部曲&#xff1a; 1、确定dp数组&#xff08;dp table&#xff09;…