Spring编程模型(范式)
面向对象编程
契约接口:Aware
aware:意识到的
契约接口(Aware)是Spring框架中的一个特性,它允许Bean对象意识到它们所在的环境并与之进行交互,用于提供特定的功能或信息给Bean对象。这些接口通常作为回调接口,在Bean初始化过程中被Spring容器调用,以便向Bean提供额外的环境信息或资源。通过实现相对应的Aware接口,Bean可以获取对应的Spring容器实例或其他相关资源。
举个例子:
- ApplicationContextAware:通过实现该接口,Bean可以获取当前所在ApplicationContext实例,从而可以访问容器的功能和资源。
- BeanFactoryAware:通过实现该接口。Bean可以获取当前所在的BeanFactory实例,从而可以获取其他Bean对象或进行自定义的Bean实例化操作。
- BeanNameAware:通过实现该接口,Bean可以获取自身在容器中的Bean名称。
- EnvironmentAware:通过实现该接口,Bean可以获取Spring的Environment对象,从而可以获取配置属性、配置文件等环境相关的信息。
- ResourceLoaderAware:通过实现该接口,Bean可以获取ResourceLoader对象,从而可以加载外部资源文件。
设计模式
- 单例模式:Bean默认是以单例模式创建的,容器中只有一个实例。这样可以保证整个应用程序中共享同一个对象实例,提高性能并减少资源消耗。
- 工厂模式:Spring中BeanFactory和ApplicationContext充当了工厂的角色,负责创建和管理Bean对象。通过使用工厂模式,可以将对象的创建和配置细节与使用代码分离,提供了更高的灵活性和可扩展性。
- 观察者模式:JSR 303、380参数校验时,Spring使用观察者模式实现当属性值发生变化时,绑定器会通知监听器进行相应的处理。Bean生命周期管理中,BeanPostProcessor接口允许开发人员在Bean实例化、初始化、销毁的过程中插入自定义逻辑。实现BeanPostProcessor接口的类可以作为观察者,观察并修改Bean的创建和初始化过程。
- 适配器模式(Adapter):Spring中的适配器模式常用于整合不同的技术或框架。例如,Spring提供了JDBC适配器,用于将不同数据库的驱动程序适配为统一的接口,使得应用程序可以无缝切换不同数据库。同时在MDC中,MDCAdapter也通过适配器模式适配Logback、log4j等。
面向切面编程
基于接口的JDK动态代理
JDK动态代理是通过Java的反射机制实现的。它要求目标对象实现一个或多个接口。在运行时,通过Proxy类和InvocationHandler接口创建代理对象。代理对象实现了目标接口,并将方法调用转发给InvocationHandler的invoke()方法,在invoke()方法中可以添加切面逻辑。
基于类的CGLIB动态代理
CGLIB(Code Generation Library)动态代理是通过继承目标类并重写方法来实现的。它不要求目标对象实现接口,而是创建目标类的子类作为代理对象。在运行时,通过Enhancer类创建代理对象,并设置回调函数(MethodInterceptor),在回调函数中可以添加切面逻辑。
字节码提升
- ASM(Analyzing and Manipulating Java bytecode,Java字节码操作框架):ASM是一个强大的Java字节码操作框架,它可以直接操作Java字节码,包括生成、转换和分析字节码。在AOP中,ASM可用于生成动态代理类的字节码,从而实现对目标对象方法的拦截和切面逻辑的织入。
- CGLIB(Code Generation Library):CGLIB是一个针对Java字节码的代码生成库,它可以在运行时生成目标类的子类。在AOP中,CGLIB可以通过生成目标类的子类来实现动态代理,从而在方法调用前后插入切面逻辑。
- AspectJ:AspectJ是一个功能强大的AOP框架,它提供了更为完整和细粒度的AOP支持。AspectJ不仅支持静态织入(编译时织入),还支持动态织入(运行时织入)。动态织入使用AspectJ提供的运行时代理机制来实现切面逻辑的织入。
面向元编程
面向元编程(Metaprogramming)是一种编程范式,它涉及编写能够创建、操作或操纵其他程序或自身代码的程序。元编程使开发人员能够在运行时动态地操作代码结构、生成代码、修改代码行为等。
面向元编程的目标是通过编写代码来操作代码本身,以提高代码的灵活性、可扩展性和可重用性。它允许程序在运行时动态地创建、修改和执行代码,而不仅仅是编写静态的、预定义的代码。
面向元编程常用技术/工具
- 反射:通过反射机制,程序可以在运行时获取和操作类、方法、字段等的信息,包括创建对象、调用方法、修改字段值等。反射使得程序能够动态地检查和操作代码结构。
- 模式注解:注解处理器允许开发人员编写自定义注解,并在编译时处理这些注解以生成额外的代码。它可以用于自动生成代码、实现依赖注入、生成配置文件等。
- Environment:它定义了访问应用程序环境和配置属性的方法。最典型的用例是通过不同的环境去加载不同配置文件中的配置,如dev、testing、prod。
- GenericTypeResolver:主要作用是在运行时获取和处理泛型类型信息,以便进行类型推断、类型转换或其他类型相关的操作。它可以帮助开发者在运行时动态地获取泛型参数的实际类型,而不仅仅是在编译时使用泛型类型擦除的信息。
- 模板引擎(Template Engine):模板引擎允许开发人员编写带有占位符的模板代码,并通过填充占位符来生成最终的代码。模板引擎通常具有逻辑控制结构和变量替换功能,可以用于生成重复性的代码或动态生成代码。
举个例子
/*** Author: liu_pc* Date: 2023/8/21* Description: 元注解* Version: 1.0*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@interface MyAnnotation {String value();
}
/*** Author: liu_pc* Date: 2023/8/21* Description: 测试元注解* Version: 1.0*/
@MyAnnotation("Hello, AnnotationUtils!")
public class MyClass {public static void main(String[] args) {MyAnnotation annotation = AnnotationUtils.findAnnotation(MyClass.class, MyAnnotation.class);if (annotation != null) {String value = annotation.value();System.out.println(value);}}
}
函数驱动
模块驱动
相关文章:
Spring编程模型(范式)
面向对象编程 契约接口:Aware aware:意识到的 契约接口(Aware)是Spring框架中的一个特性,它允许Bean对象意识到它们所在的环境并与之进行交互,用于提供特定的功能或信息给Bean对象。这些接口通常作为回调接口,在Bean初始化过程…...

Golang GORM 单表删除
删除只有一个操作,delete。也是先找到再去删除。 可以删除单条记录,也可以删除多条记录。 var s Studentdb.Debug().Delete(&s, "age ?", 100)fmt.Println(s)[15.878ms] [rows:1] DELETE FROM student WHERE age 100var s Studentdb.De…...

Windows 下 MySQL 源码学习环境搭建步骤【建议收藏】
【建议收藏】Windows 下如何安装最新版 MySQL 源码学习的调试环境步骤。 作者:芬达 《芬达的数据库学习笔记》公众号作者,开源爱好者,擅长 MySQL、ansible。 本文来源:原创投稿 爱可生开源社区出品,原创内容未经授权不…...
redis总复习
springboot基于redisson实现看门狗锁:Springboot基于Redisson实现Redis分布式可重入锁【案例到源码分析】_springboot redission lock_AP0906424的博客-CSDN博客 springboot基于redis实现设置缓存和过期时间的代码?包括key的设计 https://mbd.baidu.com/ug_share…...

[LeetCode - Python]844. 比较;含退格的字符串(Easy);415. 字符串相加(Easy)
1.题目 844. 比较含退格的字符串(Easy) 1.代码: class Solution:def backspaceCompare(self, s: str, t: str) -> bool:# 暴力法s list(s)t list(t)M 0N 0for i in range(len(s)):i -M if s[i] # :if i > 0 :s.pop(i)s.pop(i-…...

机器学习深度学习——NLP实战(自然语言推断——注意力机制实现)
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——NLP实战(自然语言推断——数据集) 📚订阅专栏:机器学习&…...

mac垃圾清理软件有哪些
随着使用时间的增加,mac系统会产生一些垃圾文件,影响系统的性能和稳定性。为了保持mac系统的高效,用户需要定期使用mac垃圾清理软件来清理系统缓存、日志、语言包等无用文件。CleanMyMac是一款功能强大的mac垃圾清理软件,它可以帮…...
8.18 校招 内推 面经
绿泡泡: neituijunsir 交流裙,内推/实习/校招汇总表格 1、校招 | 小米集团2024届全球校园招聘正式启动(内推) 校招 | 小米集团2024届全球校园招聘正式启动(内推) 2、2023校招总结--软件测试岗位 - 2 2…...
docker的web管理平台docker.ui
docker.ui安装 docker run --name docker.ui \ -p 8999:8999 \ --restartalways \ -v /var/run/docker.sock:/var/run/docker.sock \ -d joinsunsoft/docker.ui参数说明: docker run:启动container–name:容器命名–restartalwaysÿ…...

20230822 Windows上使用find_package引入OpenCV报错
报错信息 打开Cmake项目时,find_package 报错: Found OpenCV Windows Pack but it has no binaries compatible with yourconfiguration.You should manually point CMake variable OpenCV_DIR to your build of OpenCVlibrary.原因 大概率原项目是在 …...

MySQL下载安装配置
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

3D WEB轻量化引擎HOOPS产品助力NAPA打造船舶设计软件平台
NAPA(Naval Architectural PAckage,船舶建筑包),来自芬兰的船舶设计软件供应商,致力于提供世界领先的船舶设计、安全及运营的解决方案和数据分析服务。NAPA拥有超过30年的船舶设计经验,年营业额超过2560万欧…...

lesson9: C++多线程
1.线程库 1.1 thread类的简单介绍 C11 中引入了对 线程的支持 了,使得 C 在 并行编程时 不需要依赖第三方库 而且在原子操作中还引入了 原子类 的概念。要使用标准库中的线程,必须包含 < thread > 头文件 函数名 功能 thread() 构造一个线程对象…...
安卓修改SwitchCompat色值
SwitchCompat控件色值跟系统设置的主题有关,但是主题效果不是能轻易就能改的,因为涉及到整个APP的样式。网上方案基本都是通过修改style文件来改变色值,经过多次尝试修改最终觉得单独修改控件色值比较好。 一、控件属性 //修改开关色值就是最…...

pytorch内存泄漏
问题描述: 内存泄漏积累过多最终会导致内存溢出,当内存占用过大,进程会被killed掉。 解决过程: 在代码的运行阶段输出内存占用量,观察在哪一块存在内存剧烈增加或者显存异常变化的情况。但是在这个过程中要分级确认…...
20230821-字符串相乘-给树命名(unordered_map)
字符串相乘 有两个非负整数字符串num1,num2,计算num1和num2所表达整数的乘积,结果以字符串形式存储。注意:不能通过强制转换方法解题。 示例1: 输入: "4", "3" 输出: "12" …...

[Go版]算法通关村第十二关黄金——字符串冲刺题
目录 题目:最长公共前缀解法1:纵向对比-循环内套循环写法复杂度:时间复杂度 O ( n ∗ m ) O(n*m) O(n∗m)、空间复杂度 O ( 1 ) O(1) O(1)Go代码 解法2:横向对比-两两对比(类似合并K个数组、合并K个链表)复…...
neovim为工作区添加本地clangd配置
1 背景 尝试使用neovim开发stm32,使用clangd作为LSP提供代码补全等功能。 2 思路 使用stm32cubeMX生成一个基于makefile的stm32工程。 使用bear或compiledb基于makefile生成compile_commands.json文件。 为clangd配置--query-driver选项,使其使用arm…...

信号处理--基于EEG脑电信号的眼睛状态的分析
本实验为生物信息学专题设计小项目。项目目的是通过提供的14导联EEG 脑电信号,实现对于人体睁眼和闭眼两个状态的数据分类分析。每个脑电信号的时长大约为117秒。 目录 加载相关的库函数 读取脑电信号数据并查看数据的属性 绘制脑电多通道连接矩阵 绘制两类数据…...

Redis高可用:主从复制详解
目录 1.什么是主从复制? 2.优势 3.主从复制的原理 4.全量复制和增量复制 4.1 全量复制 4.2 增量复制 5.相关问题总结 5.1 当主服务器不进行持久化时复制的安全性 5.2 为什么主从全量复制使用RDB而不使用AOF? 5.3 为什么还有无磁盘复制模式ÿ…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
用鸿蒙HarmonyOS5实现中国象棋小游戏的过程
下面是一个基于鸿蒙OS (HarmonyOS) 的中国象棋小游戏的实现代码。这个实现使用Java语言和鸿蒙的Ability框架。 1. 项目结构 /src/main/java/com/example/chinesechess/├── MainAbilitySlice.java // 主界面逻辑├── ChessView.java // 游戏视图和逻辑├──…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...

EEG-fNIRS联合成像在跨频率耦合研究中的创新应用
摘要 神经影像技术对医学科学产生了深远的影响,推动了许多神经系统疾病研究的进展并改善了其诊断方法。在此背景下,基于神经血管耦合现象的多模态神经影像方法,通过融合各自优势来提供有关大脑皮层神经活动的互补信息。在这里,本研…...

RabbitMQ 各类交换机
为什么要用交换机? 交换机用来路由消息。如果直发队列,这个消息就被处理消失了,那别的队列也需要这个消息怎么办?那就要用到交换机 交换机类型 1,fanout:广播 特点 广播所有消息:将消息…...