5个月的精华:Spring/SpringBoot扩展点手册:手册在手,编码无忧:全网独一份 - 第451篇

news2024/12/23 13:46:53

历史文章(文章累计450+)

《国内最全的Spring Boot系列之一》

《国内最全的Spring Boot系列之二》

《国内最全的Spring Boot系列之三》

《国内最全的Spring Boot系列之四》

《国内最全的Spring Boot系列之五》

利用Spring扩展点模拟Feign实现远程调用(干货满满)「扩展点实战系列」- 第445篇

深入Feign源码吃透Spring扩展点「扩展点实战系列」- 第446篇

利用Spring扩展点对敏感信息加密解密,一文集齐n多知识点「扩展点实战系列」」- 第447篇

利用Spring扩展点模拟MyBatis的注解编程「知识点多多」「扩展点实战系列」- 第448篇

走进MyBatis源码一探Spring扩展点「知识点多多」「扩展点实战系列」- 第449篇

走进SpringBoot源码吃透Spring扩展点「扩展点实战系列」- 第450篇

导读

第一篇扩展点文章发表于2022-05-16,至今到这一篇文章耗时5个月左右

一方面是总结之前的文章,本文主要是对于这系列的扩展点概念和实战做个汇总。

对于Spring扩展点的系列文章,全网独有一份,绝对良心出品,如有雷同,请@我。

扩展点概念系列:

01.《SpringBoot/Spring扩展点系列之初出茅庐ApplicationContextInitializer》

https://mp.weixin.qq.com/s/rXxeWhGEvhDf2__Nk2_f8A

典型的应用场景是web应用中需要编程方式对应用上下文做初始化。比如,注册属性源(propertysources)或者针对上下文的环境信息environment激活相应的profile。

02.《SpringBoot/Spring扩展点系列之略有小成BeanDefinitionRegistryPostProcessor》

https://mp.weixin.qq.com/s/JNXOKfWnwCH5--QYqiqj4g

使用场景:动态注册bean,举例:

(1)mybatis-spring就是通过此扩展向spring容器中加入我们mapper的实现类的。(2)Feign 远程调用实现。

03.《SpringBoot/Spring扩展点系列之叱咤风云BeanFactoryPostProcessor》

https://mp.weixin.qq.com/s/_gGNZlJ4ARkTr1w1AcetDA

使用场景:

(1)对敏感信息的解密处理

数据库的连接配置中,用户名和密码都是明文配置的,这就存在泄漏风险,还有redis的连接配置、shiro的加密算法、rabbitmq的连接配置等等,凡是涉及到敏感信息的,都需要进行加密处理,信息安全非常重要。

配置的时候以密文配置,在真正用到之前在spring容器中进行解密,然后用解密后的信息进行真正的操作。

(2)Spring中占位符的处理

04.《SpringBoot/Spring扩展点系列之使用InstantiationAwareBeanPostProcessor模拟AOP实现》

https://mp.weixin.qq.com/s/r4F61PkVmZ3rTZOdTg8mAQ

BeanPostProcessor典型的应用场景时在AOP生成代理对象的时候,AOP代理需要创建被代理类的对象,才能对对象进行代理。根据代理的特点,通过在BeanPostProcessor#postProcessAfterInitialization方法执行的时候,对被代理对象进行增强,这样就可以生成新的代理对象。

05.《SpringBoot/Spring扩展点系列之SmartInstantiationAwareBeanPostProcessor确定执行哪一个构造方法》

https://mp.weixin.qq.com/s/cpOin3A9JF5yz17_JWft5Q

当一个bean中有两个构造方法的时候,一个无参构造方法,一个有参构造方法,那么spring在进行bean初始化的时候回默认调用无参的构造方法。

06.《SpringBoot/Spring扩展点系列之ApplicationContextAwareProcessor普通类获取Spring Bean》

https://mp.weixin.qq.com/s/UjSfjyR2epIlB6VH33QHZw

6个扩展点:

(1)EnvironmentAware:用于获取Enviroment的一个扩展类,这个变量非常有用, 可以获得系统内的所有参数。当然个人认为这个Aware没必要去扩展,因为Spring内部都可以通过注入的方式来直接获得。

(2)EmbeddedValueResolverAware:用于获取StringValueResolver的一个扩展类, StringValueResolver用于获取基于String类型的properties的变量,一般我们都用@Value的方式去获取,如果实现了这个Aware接口,把StringValueResolver缓存起来,通过这个类去获取String类型的变量,效果是一样的。

(3)ResourceLoaderAware:用于获取ResourceLoader的一个扩展类,ResourceLoader可以用于获取classpath内所有的资源对象,可以扩展此类来拿到ResourceLoader对象。

(4)ApplicationEventPublisherAware:用于获取ApplicationEventPublisher的一个扩展类,ApplicationEventPublisher可以用来发布事件,结合ApplicationListener来共同使用,下文在介绍ApplicationListener时会详细提到。这个对象也可以通过spring注入的方式来获得。

(5)MessageSourceAware:用于获取MessageSource的一个扩展类,MessageSource主要用来做国际化。

(6)ApplicationContextAware:用来获取ApplicationContext的一个扩展类,ApplicationContext应该是很多人非常熟悉的一个类了,就是spring上下文管理器,可以手动的获取任何在spring上下文注册的bean,我们经常扩展这个接口来缓存spring上下文,包装成静态方法。同时ApplicationContext也实现了BeanFactory,MessageSource,ApplicationEventPublisher等接口,也可以用来做相关接口的事情。

07.《SpringBoot/Spring扩展点系列之初始化之@PostConstruct、init-method、InitializingBean》

https://mp.weixin.qq.com/s/hHwlvtaUK2C5hE_I-eYEog

对于初始化数据常用的有3种实现方式:

(1)使用JSR-250规范定义的@Postconstruct注解。

(2)使用Spring提供的@Bean init-method标签。

(3)实现InitializingBean接口,实现afterPropertiesset()方法。

08.《SpringBoot/Spring扩展点系列之FactoryBean让你不在懵逼》

https://mp.weixin.qq.com/s/Q_dvZEM1FjRnLt1avy8BFw

FactoryBean在Spring中最为典型的一个应用就是用来创建AOP的代理对象:AOP实际上是Spring在运行时创建了一个代理对象,也就是说这个对象,是我们在运行时创建的,而不是一开始就定义好的,这很符合工厂方法模式。更形象地说,AOP代理对象通过Java的反射机制,在运行时创建了一个代理对象,在代理对象的目标方法中根据业务要求织入了相应的方法。这个对象在Spring中就是——ProxyFactoryBean。

09.《SpringBoot/Spring扩展点系列之SmartInitializingSingleton》

https://mp.weixin.qq.com/s/Mf4ovRiGtE_0x6aX7NGzZw

主要应用场合就是在所有单例bean创建完成之后,可以在该回调中做一些事情。

10.《SpringBoot/Spring扩展点系列之CommandLineRunner和ApplicationRunner实现缓存预热》

https://mp.weixin.qq.com/s/DEeO33DVQsAYLAcYYBjzkQ

用于应用服务启动时,加载一些数据和执行一些应用的初始化动作。举例说明:

(1)删除临时文件。

(2)缓存预热:项目启动时热加载数据库数据至缓存。

(3)清除缓存信息。

(4)读取配置文件信息。

(5)打印日志用于标识服务启动成功或者标识某些属性加载成功。

(6)设置属性值或者启动组件,例如开启某些组件的开关、一些应用级别缓存的加载、启动定时任务等等。

(7)需要使用main方法的入参。

11.《SpringBoot/Spring扩展点系列之初始化和销毁的3种办法》

https://mp.weixin.qq.com/s/JZAgefKuLcKV43KbSh4Ijg

(1)第一种,通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁 bean 之前进行的操作。

(2)第二种,通过 在xml 中定义 init-method和  destory-method 方法。

(3)第三种,通过bean 实现 InitializingBean和DisposableBean 接口。

扩展点实战系列:

01.《观察者模式实际应用场景「扩展点实战系列」》

https://mp.weixin.qq.com/s/ijO9lAAcjg9tsPRVt5wBGg

扩展点,ApplicationListener可以监听某个事件的event,触发时机可以穿插在业务方法执行过程中,用户可以自定义某个业务事件。

02.《服务信息上报+记录请求信息+监听项目运行状态还能这么玩🐴「扩展点实战系列」》

https://mp.weixin.qq.com/s/6GwVy4LH_GEs9GRxYoB8xg

对于ApplicationListener是事件监听,那么事件的定义就会很重要,对于Spring框架提供了几个事件ContextRefreshedEvent、ContextStartedEvent、ContextStoppedEvent、RequestHandledEvent。另外对于我们可以通过继承抽象类ApplicationEvent来自定义事件。对于自定义事件,那么需要事件的发布。

03.《配置类信息赋值为Java静态变量「扩展点实战系列》」》

https://mp.weixin.qq.com/s/2y3VoFCeUGf6h5R7nnnd6Q

对于配置文件application.properties或者application.yml中的配置属性,希望封装成一个Java对象。耶,这个看起来很简单呢,@Value不就可以实现了吗?那如果我在加一个条件,就是这个属性是静态属性呢?对于这样的情况具体怎么玩呢?

04.《3种方案扩展RestTemplate让其具备负载均衡(超级详细)「扩展点实战系列」》

https://mp.weixin.qq.com/s/pxYIsTzkSiTVSwS7Wluh-Q

三种负载均衡的方案:

(1)根据不同的算法获得url,然后使用RestTemplate进行请求。

(2)在构造RestTemplate的时候,注入拦截器拦截请求,根据不同的算法重新构建请求。

(3)使用注解和Spring的扩展点,RestTemplate创建的时候,注入拦截器拦截请求,根据不同的算法重新构建请求。

05.《一个注解@LoadBalanced就能让RestTemplate拥有负载均衡的能力?「扩展点实战系列」》

https://mp.weixin.qq.com/s/zQPkdbD6y0yoMaBeRSiuag

利用Spring的扩展点SmartInitializingSingleton,在该方法执行的核心逻辑,就是添加自定义的拦截器,拦截RestTemplate的请求,从而对于请求地址进行特殊的处理以此来实现负载均衡。

06.《Spring注解@Qualifier的详细用法你知道几种「扩展点实战系列」》

https://mp.weixin.qq.com/s/VVXaCw_eTENAEnqPQqY_Yw

(1)@Qualifier是一个限定符号,用来限定注入类以及筛选注入对象。

(2)当一个项目中存在多个同类型的Bea你的时候,避免报required a single bean, but 2 were found的方案有如下几种:

①方案1:通过名称来自动注入,定义的变量名称和注入的bean的名称是一样的。

②方案2:使用@Qualifier限定符号,在类上添加@Qualifier注解限定注入类。

③方案3:使用@Primary定义首选项,只需要在注入Bean上添加@Primary定义首选项,那么该Bean就会作为首选进行注入。

07.《利用Spring扩展点模拟FeignClient实现远程调用(干货满满)「扩展点实战系列」》

https://mp.weixin.qq.com/s/Y6sjVA7vahDGSAudx50uQA

用过MyBatis的注解编程和@FeignClient,是不是有一点好奇,我们写的代码都是接口,也没有具体的实现类,接口怎么能执行呢?底层到底发生了事情?

08.《深入FeignClient源码吃透Spring扩展点「扩展点实战系列」》

https://mp.weixin.qq.com/s/9Gq1XJwFMaxQyPtuau5s_w

增加@EnableFeignClients注解开始,当我们启动应用的时候,系统就会扫描所有的包里面带有@FeignClient接口的类,并为此生成代理对象,这个代理对象会设置我们写的各种配置与拦截器,并最终注入到Spring的IOC容器中,当我们调用@FeignClient接口的类的方法时,其实是调用生成的代理类的方法。

09.《SpringBoot配置文件内容加密,实现敏感信息保护「扩展点实战系列」》

https://mp.weixin.qq.com/s/iV1zWfrq9M9IFV8-KcvPKw

配置文件中,其实包含着大量与安全相关的敏感信息,比如:数据库的账号密码、一些服务的密钥等。这些信息一旦泄露,对于企业的重要数据资产,那是相当危险的。所以,对于这些配置文件中存在的敏感信息进行加密,是每个成熟开发团队都一定会去的事。

10.《利用Spring扩展点对敏感信息加密解密,一文集齐n多知识点「扩展点实战系列」》

https://mp.weixin.qq.com/s/z4TAaroiRHrcN5bjuLjBdg

使用到的扩展点是BeanFactory的后处理器BeanFactoryPostProcessor。

11.《利用Spring扩展点模拟MyBatis的注解编程「扩展点实战系列」》

https://mp.weixin.qq.com/s/i1Buu9PfU8ApM1_Fjya2mQ

接口没有使用Spring注解标识,如何被注册成为Spring Bean?答案:利用Spring的扩展点ImportBeanDefinitionRegistrar动态注册Bean定义。

12.《走进MyBatis源码一探Spring扩展点「知识点多多」「扩展点实战系列」》

https://mp.weixin.qq.com/s/yt7PeOuyqvNJ6njI_QkUcw

涉及到的Spring扩展点:

(1)@Import用于导入普通类到Spring中,实现扩展点ImportBeanDefinitionRegistrar,核心的方法是registerBeanDefinitions。

(2)

BeanDefinitionRegistryPostProcessor:BeanDefinitionRegistryPostProcessor这个接口继承了BeanFactoryPostProcessor。从名字上来看, 这个接口是BeanDefinitionRegistry的后处理器, 我们先介绍下BeanDefinitionRegistry。

(3)InitializingBean:在Spring Bean初始化后自动做一些事情。

(4)ApplicationContextAware:用来获取ApplicationContext的一个扩展类,ApplicationContext应该是很多人非常熟悉的一个类了,就是spring上下文管理器,可以手动的获取任何在spring上下文注册的bean。

(5)BeanNameAware:BeanNameAware接口是为了让自身Bean能够感知到,获取到自身在Spring容器中的id或name属性。

Spring自动调用。并且会在Spring自身完成Bean配置之后,且在调用任何Bean生命周期回调(初始化或者销毁)方法之前就调用这个方法。换言之,在程序中使用BeanFactory.getBean(String beanName)之前,Bean的名字就已经设定好了。

执行顺序上,先执行BeanNameAware接口的setBeanName方法,再执行ApplicationContextAware接口的setApplicationContext方法。

(6)FactoryBean:FactoryBean 就是一个工厂Bean,相当于将工厂类放到了Spring中管理、当获取此Bean的时候返回的是此工厂生成的Bean。

13.《走进SpringBoot源码吃透Spring扩展点「扩展点实战系列」》

https://mp.weixin.qq.com/s/Rj0v-tm3wYwuN-Ivy7Q0_A

走进Spring Boot源码,来看一下这些扩展点都是在Spring Boot的哪个地方被调用的。

CSDN专栏:

Spring/SpringBoot扩展点实战系列

https://blog.csdn.net/linxingliang/category_12015682.html

 

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

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

相关文章

使用Cpolar+freekan源码 创建在线视频网站

文章目录1.前言2.本地网页搭建1.1 环境使用1.2 支持组件和环境设置1.3 支持组件选和环境设置1.4 网页安装1.5 测试和使用1.6 问题解决3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语1.前言 随着网络条件的改善和移动智能设备的普及,在线…

C++语法——右值引用、移动构造和赋值、万能引用和转发、move和forward底层实现

目录 一.右值引用 (一).何为右值 (二).右值引用 (三).右值和左值的互相传递 ①左值->右值引用 ②右值->左值引用 (四).右值引用的自身属性 二.移动构造和移动赋值 &…

艾美捷Bio-Helix CCH321 超敏ECL化学发光试剂盒(皮克级)特点

UltraScene Pico Plus Western底物是一种基于鲁米诺的增强化学发光底物,它敏感且与辣根过氧化物酶(HRP)偶联的二级抗体进行免疫印迹兼容。UltraScene Pico Plus Western Substrate具有卓越的灵敏度和长信号持续时间,可实现抗原的低…

Day09--导入小程序项目,初步安装和使用vant组件库

1.拿到老师的资料mp_5 ************************************************************************************************************** 2.Day09--的大概流程 *****************************************************************************************************…

MySQL数据库期末考试试题及参考答案(04)

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 一、填空题 MySQL中提供了____关键字,可以在查询时去除重复的值。使用ORDER BY对查询结果进行排序时,默认是按____排列。SELECT语句中,用…

Android启动优化之多线程依赖线程池

背景 开发中会存在多个任务之间互相依赖,运行非常慢的情况,譬如Android在主线程中初始化多个SDK导致App启动慢的情况,搜索一下发现业界的通用做法是构造任务的有向无环图,拓扑排序生成有序的任务列表,然后用线程池执行…

[JavaScript] 用电脑计算圆周率评估计算性能

据说全球第一台计算机是在1946年面世的,那它的计算性能是怎样的,至今2022年,发展这么多年,现在的普通计算机性能又是怎样的呢,接下来做一个实验,评估计算性能 文章目录1. 设计2. 编程3. 测试1. 设计 先写一…

[第十三篇]——Docker Compose

Docker Compose Compose 简介 Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。 如果你还不了解…

G1D18-WarshallFloyd课程报告matlab下载

今天先从算法开始吧嘿嘿~ 一、DP (一)Warshall求闭包 1、DP大概看明白啦~ 2、一会再看一下基于邻接表的暴搜 (二)Floyd完全最短路径的Floyd算法 欸嘿~~基本上好啦还差一点图的遍历晚上问问同学吧! 啊哈大概看了一…

BUUCTF·[WUSTCTF2020]大数计算·WP

BUUCTF在线评测 (buuoj.cn) 附件 flag等于 wctf2020{Part1-Part2-Part3-Part4} 每一Part都为数的十六进制形式(不需要0x),并用 - 连接 Part1 2020*2019*2018* ... *3*2*1 的前8位 Part2 520^1314 2333^666 的前8位 Part3 宇宙终极问题的答案 x,y,z绝…

CF461B Appleman and Tree题解

洛谷题面 感觉是非常经典的一道题,最近好像总是见到,今天也算给它做了,发一篇题解来记录一下。 这道题是一道树形 DP 题,设 f[u][0/1]f[u][0/1]f[u][0/1] 表示 uuu 点属于一个无黑点 /// 有且仅有一个黑点的联通块时的方案数。我…

【HDR】Deep high dynamic range imaging of dynamic scenes

文章目录一、贡献二、数据集构建三、算法框架3.1 对齐模块3.2 合成模块3.3 损失函数四、实验一、贡献 Paper: Deep high dynamic range imaging of dynamic scenes Code:https://github.com/TH3CHARLie/deep-high-dynamic-range 首次提出使用机器学习方…

Pdfjs使用

pdfjs使用一、下载二、Springboot引入pdfjs三、利用PDFJS预览pdf文件并加水印四、后端将pdf添加水印参看链接一、下载 pdfjs官方地址 二、Springboot引入pdfjs 针对于pdfjs方面有用的只是pdf这个包下面和viewer.html这个html页面viewer.html是我们用来展示pdf的页面不需要改但…

高压功率放大器在超声悬浮中的应用研究

高压功率放大器的叫法对于不同的人来说是完全不同的,有人叫功率放大器,也有人叫电压放大器,但它们都是指同一个电子测量仪器设备,主要是指内部能够拥有电压和功率放大电路,可以把微弱的外部信号进行放大输出的放大器。…

在华为云 OSC 上快速部署 EMQX MQTT 集群

EMQX Kubernetes Operator 是 EMQ 发布的一个封装、部署和管理工具,也是一个特定的应用控制器,方便 DevOps 人员在 Kubernetes 上编排 EMQX MQTT 消息服务集群,管理其生命周期。 华为云原生基础设施(云容器引擎 CCE、容器镜像服务…

索引数据结构千千万 , 为什么B+Tree独领风骚

索引的由来 大数据时代谁掌握了数据就是掌握了流量,就是掌握的号召力。面对浩瀚的数据如何存储并非难事, 难点在于如何在大数据面前查询依旧快如闪电! 这时候索引就产生了,索引的产生主要还是借鉴于图书管理员书签的功能。在大数…

谷歌、微软、Meta?谁才是 Python 最大的金主?

你知道维护 Python 这个大规模的开源项目,每年需要多少资金吗? 答案是:约 200 万美元! PSF(Python 软件基金会)在 2022 年 6 月发布了 2021 的年度报告,其中披露了以下这份支出明细(…

大家介绍一篇学生选课系统的设计与实现

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

若依框架字典配置以及使用(结合vue和emelent)

一:字典数据创建(我们公司是后端做的,前端不用管) 1.首先新建要指定的默认角色 (1)必须用管理员账号登录才能看到角色管理 (2)具体怎写,可以参考已有的数据&#xff08…

低代码平台中的“模型驱动”与“表单驱动”有何区别?

低代码定义: 低代码是近几年比较火的一种应用程序快速开发方式,它能帮助用户在开发软件的过程中大幅减少手工编码量,并通过可视化组件加速应用程序的高效交付。(低代码的定义来自Forrester报告,被认为是低代码一词的起…