Spring容器扩展点在微服务中的使用

news2024/9/20 16:38:08

(20230306)Spring容器扩展点在微服务中的使用

文章目录

  • 1. Spring扩展点梳理
  • 2.Spring扩展点应用场景
    • 2.1 整合Nacos
      • ApplicationListener扩展场景——监听容器中发布的事件
      • Lifecycle扩展场景——管理具有启动、停止生命周期需求的对象
    • 2.2 整合Ribbon
      • SmartInitializingSingleton扩展场景—— 对容器中的Bean对象进行定制处理
    • 2.3 整合Feign
      • FactoryBean的扩展场景——将接口生成的代理对象交给Spring管理
    • SmartInitializingSingleton&FactoryBean结合场景——根据类型动态装配对象

1. Spring扩展点梳理

  • BeanFactoryPostProcessor
    • BeanDefinitionRegistryPostProcessor bean注册后置处理器
  • BeanPostProcessor
    • InstantiationAwareBeanPostProcessor
    • AbstractAutoProxyCreator
  • @Import
    • ImportBeanDefinitionRegistrar
    • ImportSelector
  • Aware
    • ApplicationContextAware
    • BeanFactoryAware
  • InitializingBean || @PostConstruct
  • FactoryBean
    • mybatis feign 实现
  • SmartInitializingSingleton
  • ApplicationListener
  • Lifecycle
    • SmartLifecycle
    • LifecycleProcessor
  • HandlerInterceptor
    • springmvc拦截器
  • MethodInterceptor
    • 切面中的拦截器

Bean生命周期主线流程:

https://www.processon.com/view/link/5eafa609f346fb177ba8091f

2.Spring扩展点应用场景

2.1 整合Nacos

ApplicationListener扩展场景——监听容器中发布的事件

思考: 为什么整合Nacos注册中心后,服务启动就会自动注册,Nacos是如何实现自动服务注册的?
在这里插入图片描述

NacosAutoServiceRegistration

​ # 对ApplicationListener的扩展 AbstractAutoServiceRegistration#onApplicationEvent # 服务注册 》NacosServiceRegistry#register

​ 监听 WebServerInitializedEvent 这个事件
在这里插入图片描述

Lifecycle扩展场景——管理具有启动、停止生命周期需求的对象

介绍: https://www.jianshu.com/p/7b8f2a97c8f5

NacosWatch

​ #对SmartLifecycle的扩展 NacosWatch#start #订阅服务接收实例更改的事件 》NamingService#subscribe


在这里插入图片描述

扩展: Eureka Server端上下文的初始化是在SmartLifecycle#start中实现的

EurekaServerInitializerConfiguration

在这里插入图片描述

Eureka Server源码分析:

在这里插入图片描述

2.2 整合Ribbon

SmartInitializingSingleton扩展场景—— 对容器中的Bean对象进行定制处理

思考:为什么@Bean修饰的RestTemplate加上@LoadBalanced就能实现负载均衡功能?

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

LoadBalancerAutoConfiguration

对SmartInitializingSingleton的扩展,为所有用@LoadBalanced修饰的restTemplate(利用了@Qualifier)绑定实现了负载均衡逻辑的拦截器LoadBalancerInterceptor

在这里插入图片描述

LoadBalancerInterceptor

在这里插入图片描述

在这里插入图片描述

2.3 整合Feign

FactoryBean的扩展场景——将接口生成的代理对象交给Spring管理

思考:为什么Feign接口可以通过@Autowired直接注入使用?Feign接口是如何交给Spring管理的?

     @FeignClient(value = "mall-order",path = "/order")
public interface OrderFeignService {

    @RequestMapping("/findOrderByUserId/{userId}")
    R findOrderByUserId(@PathVariable("userId") Integer userId);
}

@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    OrderFeignService orderFeignService;

    @RequestMapping(value = "/findOrderByUserId/{id}")
    public R  findOrderByUserId(@PathVariable("id") Integer id) {
        //feign调用
        R result = orderFeignService.findOrderByUserId(id);
        return result;
    }
}  

FeignClientsRegistrar

在这里插入图片描述

FeignClientFactorybean

在这里插入图片描述

在这里插入图片描述

SmartInitializingSingleton&FactoryBean结合场景——根据类型动态装配对象

SentinelDataSourceHandler

#Sentinel持久化读数据源设计,利用了SmartInitializingSingleton扩展点
SentinelDataSourceHandler#afterSingletonsInstantiated
# 注册一个FactoryBean类型的数据源 
》SentinelDataSourceHandler#registerBean 注册bean定义,通过beanFactory.getBean创建bean
》》NacosDataSourceFactoryBean#getObject
# 利用FactoryBean获取到读数据源
》》new NacosDataSource(properties, groupId, dataId, converter)

在这里插入图片描述

NacosDataSourceFactoryBean
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

定时器中断实验(stm32)

目录 TIME的代码time.ctime.h main.c TIME的代码 time.c void TIM3_Int_Init(u16 arr,u16 psc) {TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能//定时器TIM3初始化…

uview u-input 点击清除按钮,数据清空但视图未清空

问题描述&#xff1a; 点击 uview 的 u-input 输入框自带的清除按钮&#xff0c;v-model 绑定的数据清空了&#xff0c;但是输入框内还显示着之前的数据 解决方案&#xff1a; 将 v-model 绑定的值写到 data 初始变量中声明 原始代码&#xff1a; <u-input v-model"…

Spring对事务的支持

目录 事务的传播行为 一、什么是事务的传播行为 二、7种事务传播行为 1. REQUIRED 2. REQUIRES_NEW 3. NESTED 4. 总结 三、事务的传播行为&#xff08;理解记忆&#xff09; 转载&#xff1a;一个99%的人都说不清楚知识点——Spring 事务传播行为 - 哔哩哔哩 事务属性…

2023.7.7HCIA中静态路由

一、题目要求 需求&#xff1a; 1.所有节点的IP地址均属于192.168.1.0 24--子网划分 2.全网可达--静态 3.加快收敛&#xff08;尽量汇总&#xff09; 5.R6存在环回接口--6.6.6.6 24&#xff0c;不能直接写去往6.6.6.0网段的路由--缺省 6.没有环路--NUll 0 7.正常流量走100M&am…

什么是ERC20?

ERC20 是以太坊区块链上最常见的代币标准之一。它是以太坊上智能合约的一种协议&#xff0c;定义了一套规则和接口&#xff0c;使得在以太坊网络上创建和管理代币变得更加简单和标准化。 ERC20 代币标准定义了一组功能和方法&#xff0c;以便代币合约可以与其他合约和钱包进行…

dxSpreadSheetReportDesigner使用笔记

通过该控件达到显示主从表,效果如下图所示. 在界面上放置以下控件 1.新建主从表主表为tab1,从表为tab2,二表通过设置从表的mastersource及MasterFields与从表联动. 2.设置dxspreadsheetreportdesigner与主从表关联 在DataBinding中的datasource关联主从. 在details中关联从表…

UE5、CesiumForUnreal接入XYZ格式地图瓦片如高德地图、OSM、ArcGIS等

文章目录 1.实现目标2.实现过程2.1 XYZ与TMS对比2.1 cesium-native改造2.3 CesiumForUnreal插件改造2.4 XYZ瓦片加载测试3.参考资料1.实现目标 通过改造cesium-native和cesiumforunreal插件,参考tms的栅格地图瓦片加载逻辑,实现在UE5、CesiumForUnreal中接入XYZ格式的地图瓦片…

-Xmx20m -Xms5m

-Xmsjava程序启动时初始堆的大小&#xff0c;默认是物理内存的1/64-Xmxjava程序能获得的最大堆的大小&#xff0c;默认为物理内存的1/4 验证默认值 winr → systeminfo 配置JVM启动参数&#xff1a;-XX:PrintCommandLineFlags-XX:ConcGCThreads3 -XX:G1ConcRefinementThreads…

UEditor v1.4.3.3 .net版本任意文件上传 漏洞复现

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 影响范围03 验证方式04 利用方式05 实战案例06 修复方案 01 漏洞描述 UEditor是一款所见即所得的开源富文本编辑器&#xff0c;具有轻量、可定制、用户体验优秀等特点&#xff0c;被广大…

flutter聊天界面-加号【➕】更多展开相机、相册等操作Panel

flutter聊天界面-加号【➕】更多展开相机、相册等操作Panel 在之前实现了flutter聊天界面的自定义表情的展示&#xff0c;这里记录一下更多操作展开的相机、相册等操作功能实现。 一、查看效果 更多操作展开的相机、相册等操作功能实现。 二、代码实现 展开的操作按钮可能比…

前端(四)——vue.js、vue、vue2、vue3

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;vue.js、vue、vue2、vue3从全局到局部 文章目录 vue.js、vue、vue2、vue3是什么关系?Vue.js简介发展历程特点与优势生态系统Vue.js基础知识安装与配置 基本语法Vue.js主要版本解析Vue.js 2.x vue2…

python 第十一章 文件操作

系列文章目录 第一章 初识python 第二章 变量 第三章 基础语句 第四章 字符串str 第五章 列表list [] 第六章 元组tuple ( ) 第七章 字典dict {} 第八章 集合set {} 第九章 常用操作 第十章 函数 文章目录 系列文章目录11.1文件操作的作用11.2文件的基本操作打开打开文件模式 …

string底层是如何实现的

前言 在我们学习的时候总是会用到string&#xff0c;知道它具备各种功能&#xff0c;它也是一种很强大的模板&#xff0c;那么有没有想过&#xff0c;我们天天都在使用的它&#xff0c;它的底层又是怎么样的&#xff0c;它又是如何实现的呢。这里讲挑选几个比较常用的一个功能…

SGD原理及Pytorch实现

&#x1f38f;目录 &#x1f388;1 SGD       &#x1f384;1.1 原理       &#x1f384;1.2 构造       &#x1f384;1.3 参数详解——momentum ✨1 SGD &#x1f95a;2.1 原理 SGD为随机梯度下降&#xff0c;原理可看刘建平老师博客。 &#x1f383;…

Blender--原理化体积

“原理化体积 着色器将所有体积着色组件组合到一个易于使用的节点中。该节点含有散射&#xff0c;吸收和黑体辐射属性&#xff0c;因此&#xff0c;可以仅仅使用该着色器节点对烟雾和火焰等进行渲染。” 官方文档介绍&#xff1a;原理化体积 — Blender Manual 可以用于实现丁…

Rainbond开源

Rainbond的 Gateway API 插件制作实践 Gateway API 作为新一代的流量管理标准&#xff0c;对原有 Ingress 的扩展不规范、移植性差等问题做出了改进。从兼容K8s生态和优化网关体验出发&#xff0c;Rainbond 支持以插件的形式扩展平台网关能力&#xff0c;目前已经有多家社区提供…

启动项目报错,如何分析pom

报错信息如下 Caused by: java.lang.NoClassDefFoundError: org/springframework/core/metrics/ApplicationStartup 报错说找不到ApplicationStartup这个类&#xff0c;到项目中查看pom的dependency 我的项目引入了两个依赖 <parent><groupId>org.springframewor…

vue使用富文本编辑器 Wangeditor 可显示编辑新增回显禁用

1.效果图 2.安装依赖 npm install wangeditor 3.在main.js 全局引入 富文本组件 import editorBar from "/components/editor/editor.vue";Vue.component(editorBar, editorBar) 全局引入页面使用 <editor-bar v-model"form.nr" :flag"false&quo…

【高并发网络通信架构】1.Linux下实现单客户连接的tcp服务端

目录 一&#xff0c;函数清单 1.socket 方法 2.bind 方法 3.listen 方法 4.accept 方法&#xff08;阻塞函数&#xff09; 5.recv 方法&#xff08;阻塞函数&#xff09; 6.send 方法 7.close 方法 8.htonl 方法 9.htons 方法 10.fcntl 方法 二&#xff0c;代码实现…

0126 线性表

目录 2.线性表 2.1线性表的定义和基本概念 2.1部分习题 2.2线性表的顺序表示 2.2部分习题 2.3线性表的链式表示 2.3部分习题 2.线性表 2.1线性表的定义和基本概念 2.1部分习题 1.线性表是具有n个&#xff08;&#xff09;的有限序列 A.数据表 B.字符 C.…