聊聊分布式架构08——SpringBoot开启微服务时代

news2024/11/20 19:41:26

目录

微服务架构时代

快速入门

入门详解

SpringBoot的自动配置

石器时代:XML配置bean

青铜时代:SpringConfig

铁器时代:AutoConfigurationImportSelector

手写简单Starter

SpringApplication启动原理


微服务架构时代

Spring Boot的出现与微服务架构有关,它是Spring Framework的一部分,旨在简化开发独立的、可执行的Java应用程序。Spring Boot解决了传统Java应用程序开发中的繁琐配置问题,使开发人员能够更快速地构建微服务和独立应用程序。

快速入门

如果要快速入门,这个传送门一定很有帮助------->Spring | Quickstart

入门详解

Spring入门详解的部分诸君可以看一下这篇文章:

SpringBoot入门详解-CSDN博客

SpringBoot的自动配置
石器时代:XML配置bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                           http://www.springframework.org/schema/beans/spring-beans.xsd">
​
    <!-- 声明一个名为 myBean 的 Bean -->
    <bean id="myBean" class="com.elaine.MyBean">
        <property name="name" value="elaine"/>
    </bean>
​
</beans>
青铜时代:SpringConfig
@Configuration
public class MyConfiguration {
​
    @Bean
    public MyBean myBean() {
        MyBean bean = new MyBean();
        bean.setName("Elaine");
        return bean;
    }
}
铁器时代:AutoConfigurationImportSelector

SpringBoot开启自动配置的注解是@EnableAutoConfiguration,但是自动配置的核心功能是通过AutoConfigurationImportSelector实现的。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
​
    Class<?>[] exclude() default {};
​
    String[] excludeName() default {};
}
  • AutoConfigurationImportSelector实现ImportSelector接口,收集需要导入的配置类,配合@Import将相应的类导入到Spring容器中。

  • 获取注⼊类的⽅法是 selectImports(),它实际调⽤的是 getAutoConfigurationEntry ,这个⽅法是获取⾃动装配类的关键,主要流程可以分为这么⼏步:

    1. 获取注解的属性,用于后面的排除

    2. 获取所有需要⾃动装配的配置类的路径:这⼀步是最关键的,从 META-INF/spring.factories 获取⾃动 配置类的路径

    3. 去掉重复的配置类和需要排除的重复类,把需要⾃动加载的配置类的路径存储起来

    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }
​
    protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return EMPTY_ENTRY;
        } else {
            // 1.获取注解的属性
            AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
            // 2.获取需要⾃动装配的所有配置类,读取META-INF/spring.factories,获取⾃动配置类路径
            List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            // 3.1.移除重复的配置
            configurations = this.removeDuplicates(configurations);
            // 3.2.处理需要排除的配置
            Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
            this.checkExcludedClasses(configurations, exclusions);
            configurations.removeAll(exclusions);
            configurations = this.getConfigurationClassFilter().filter(configurations);
            this.fireAutoConfigurationImportEvents(configurations, exclusions);
            return new AutoConfigurationEntry(configurations, exclusions);
        }
    }
手写简单Starter

在了解自动配置的原理后,就简单地创建一个自定义的spring-boot-starter吧。

文件目录贴一下:

  1. 创建自动配置类和需要定义的bean。

    @Configuration
    public class MyUserAutoConfiguration {
        @Bean
        public UserManager userManager(){
            return new UserManager();
        }
    }
    public class UserManager {
        public String sayHello() {
            return "own-starter:hello.";
        }
    }
  2. src/main/resources/META-INF/ 目录下创建一个 spring.factories 文件

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.lloyd.user.MyUserAutoConfiguration
  3. 创建一个spring-web的SpringBoot项目,添加自定义Starter的依赖。

        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- 自定义starter的坐标 -->
            <dependency>
                <groupId>com.lloyd</groupId>
                <artifactId>springboot_06_own_starter</artifactId>
                <version>0.0.1-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
        </dependencies>

  4. 创建一个Rest接口进行验证

    @RestController
    public class UserController {
        @Autowired
        private UserManager userManager;
    ​
        @GetMapping("/user")
        public String sayHello(){
            return userManager.sayHello();
        }
    }

    浏览器结果:

SpringApplication启动原理

SpringApplication 这个类主要做了以下四件事情:

  1. 推断应⽤的类型是普通的项⽬还是 Web 项⽬

  2. 查找并加载所有可⽤初始化器 , 设置到 initializers 属性中

  3. 找出所有的应⽤程序监听器,设置到 listeners 属性中

  4. 推断并设置 main ⽅法的定义类,找到运⾏的主类

大致流程如下(图片来自于网络):

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

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

相关文章

LabVIEW中将枚举与条件结构一起使用

LabVIEW中将枚举与条件结构一起使用 枚举是一个具有相应数值的字符串标签型列表。在LabVIEW&#xff08;U8 &#xff0c; U16-默认值和U32&#xff09;中以无符号整数形式应用。 例如&#xff0c;可以有一个枚举保存四个季节&#xff0c;在这种情况下&#xff0c;每个字符串都…

2022最新版-李宏毅机器学习深度学习课程-P26RNN-2

一、RNN网络结构 与时间有关的反向传播&#xff08;每次不同&#xff09; 损失函数 实验其实不容易跑&#xff0c;因为他的损失函数曲线幅度很大 画出来差不多是这个样子。突然一下升高是因为从右到左碰到陡峭的地方梯度一下变大了&#xff0c;所以弹回去了。 原作者在训练时…

JAVA反射(原理+使用)

引言 反射是一种机制&#xff0c;能够使java程序在运行过程中&#xff0c;检查&#xff0c;获取类的基本信息&#xff08;包&#xff0c;属性&#xff0c;方法等&#xff09;&#xff0c;并且可以操作对象的属性和方法 反射是框架实现的基础 反射的原理 讲述反射的原理之前&a…

covfefe 靶机/缓冲区溢出

covfefe 信息搜集 存活检测 详细扫描 后台网页扫描 80 端口 31337 端口 网页信息搜集 分别访问扫描出的网页 说有三个不允许看的内容 尝试访问 第一个 flag 访问 .ssh 文件 继续根据提示访问 获取了三个 ssh 文件 ssh 登录 在下载的 id_rsa_pub 公钥文件中发现了…

leetCode 11. 盛最多水的容器 + 双指针

11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/container-with-most-water/description/?envTypestudy-plan-v2&envIdtop-interview-150 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是…

【Java基础面试三十三】、接口和抽象类有什么区别?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;接口和抽象类有什么区别…

大同小异!如何在苹果不同类型设备上更改AirDrop的名称

你可以更改你的AirDrop ID&#xff0c;让其他人看到你名字之外的东西。本文介绍了如何在iPhone、iPad和Mac上更改AirDrop名称。 如何在iPhone上更改AirDrop名称 在iPhone上更改AirDrop名称涉及到你可能不想做的更改。幸运的是&#xff0c;这在iPad和Mac上不是真的&#xff0c…

【408数据结构】第一章 绪论

第一章 绪论 1.数据结构基本概念及三要素 一.数据结构基本概念 1.数据 信息的载体&#xff0c;能被客观事物描述的数字&#xff0c;字符以及能被计算机程序识别和处理的符号的集合 2.数据元素 数据的基本单位&#xff0c;一个数据元素可由若干个数据项&#xff08;构成数…

Unity Animation--动画剪辑(创建动画)

创建一个新的动画编辑 创建新的动画剪辑 &#xff0c;在场景中选择一个GameObject&#xff0c;然后打开“ 动画”窗口&#xff08;顶部菜单&#xff1a;&#xff09;“ 窗口” >“ 动画” >“ 动画”。 如果GameObject 中尚未分配任何动画剪辑&#xff0c;“创建”按钮…

pytorch nn.Embedding 读取gensim训练好的词/字向量(有例子)

最近在跑深度学习模型&#xff0c;发现Embedding随机性太强导致模型结果有出入&#xff0c;因此考虑固定初始随机向量&#xff0c;既提前训练好词/字向量&#xff0c;不多说上代码&#xff01;&#xff01; 1、利用gensim训练字向量&#xff08;词向量自行修改&#xff09; #…

YCSB on MySQL(避免重复load)

一、编译安装MySQL 下载mysql5.7.28源码 https://downloads.mysql.com/archives/community/ Select Operating System 选择 Source Code Select OS version 选择 All Operating Systems 选择带有boost的版本 安装系统包 apt -y install make cmake gcc g perl bison libai…

AAOS CarMediaService 服务框架

文章目录 前言MediaSessionCarMediaService作用是什么&#xff1f;提供了哪些接口&#xff1f;如何使用&#xff1f;CarMediaService的实现总结 前言 CarMediaService 是AAOS中统一管理媒体播放控制、信息显示和用户交互等功能的服务。这一服务依赖于android MediaSession框架…

JVM第十五讲:调试排错 - Java 内存分析之堆外内存

调试排错 - Java 内存分析之堆外内存 本文是JVM第十五讲&#xff0c;Java 内存分析之堆外内存调试排错。Java 堆外内存分析相对来说是复杂的&#xff0c;美团技术团队的Spring Boot引起的“堆外内存泄漏”排查及经验总结可以为很多Native Code内存泄漏/占用提供方向性指引。 文…

政企互动 | 雨花台区委统战部一行走访调研聚铭网络

2023年10月19日上午&#xff0c;雨花台区委统战部副部长、台侨办主任勾宏展一行3人到聚铭网络调研走访&#xff0c;聚铭网络总经理唐开达热情接待了来访一行&#xff0c;并详尽地介绍了聚铭网络的发展历程、产品体系、企业文化等相关情况。 在聚铭网络总经理唐开达的陪同下&am…

Mysql表结构差异比较

1、背景 我们在开发过程中&#xff0c;大部分情况下都是好几个版本一起并行&#xff0c;有时候如果某个版本表结构改动较大&#xff0c;但是忘记了记录DDL脚本&#xff0c;这个时候需要人工去把新增或修改的DDL脚本整理出来&#xff08;主要是为了解决 数据库新增字段&#xff…

ArcGIS笔记9_数据源缺少空间参考信息?如何定义坐标系?

本文目录 前言Step 1 确定好要赋予给目标文件的恰当坐标系Step 2 定义坐标系 前言 有时从其他软件转换得到了shp文件&#xff0c;拖到ArcGIS后却出现“未知的空间参考&#xff1a;添加的数据源缺少空间参考信息 不能投影”的提示&#xff0c;如下图所示&#xff1a; 这种情况就…

go-fastdfs安装(国产分布式文件系统)

开源协议&#xff1a; Unlicense官网地址&#xff1a; https://sjqzhang.github.io/go-fastdfs/#vision安装: wget --no-check-certificate https://github.com/sjqzhang/go-fastdfs/releases/download/v1.3.1/fileserver -O fileserver && chmod x fileserver &…

【AIGC核心技术剖析】Hotshot-XL 一种 AI 文本转 GIF 模型(论文 + 代码:经过训练可与Stable Diffusion XL一起使用)

Hotshot-XL 是一种 AI 文本转 GIF 模型,经过训练可与Stable Diffusion XL一起使用。 Hotshot-XL 可以使用任何经过微调的 SDXL 模型生成 GIF。这意味着两件事: 您将能够使用您可能想要使用的任何现有或新微调的 SDXL 模型制作 GIF。 如果您想制作个性化主题的 GIF,您可以…

一张图帮你看懂,在浏览器输入网址回车后,都发生了什么?

首先我们来看图&#xff1a; 当我们在浏览器中输入一个网址&#xff0c;例如&#xff1a;baidu.com&#xff0c;按下回车键后&#xff0c;会发生什么呢&#xff1f; 主要会发生以下这些过程&#xff1a;域名解析&#xff08;获取IP地址&#xff09;、建立HTTP连接、发送HTTP请…

通用音乐播放器蜂鸣器AX301开发板verilog,视频/代码

名称&#xff1a;通用音乐播放器代码&#xff0c;蜂鸣器播放音乐 软件&#xff1a;Quartus 语言&#xff1a;Verilog 代码说明&#xff1a;本代码为音乐播放器通用代码&#xff0c;只需修改管脚即可适配其他开发板 代码功能&#xff1a; 设计一个音乐播放器&#xff0c;使用…