当前位置: 首页 > news >正文

Spring编程模型(范式)

面向对象编程

契约接口:Aware

aware:意识到的

契约接口(Aware)是Spring框架中的一个特性,它允许Bean对象意识到它们所在的环境并与之进行交互,用于提供特定的功能或信息给Bean对象。这些接口通常作为回调接口,在Bean初始化过程中被Spring容器调用,以便向Bean提供额外的环境信息或资源。通过实现相对应的Aware接口,Bean可以获取对应的Spring容器实例或其他相关资源。

举个例子:
  1. ApplicationContextAware:通过实现该接口,Bean可以获取当前所在ApplicationContext实例,从而可以访问容器的功能和资源。
  2. BeanFactoryAware:通过实现该接口。Bean可以获取当前所在的BeanFactory实例,从而可以获取其他Bean对象或进行自定义的Bean实例化操作。
  3. BeanNameAware:通过实现该接口,Bean可以获取自身在容器中的Bean名称。
  4. EnvironmentAware:通过实现该接口,Bean可以获取Spring的Environment对象,从而可以获取配置属性、配置文件等环境相关的信息。
  5. 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&#xff…...

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 中引入了对 线程的支持 了&#xff0c;使得 C 在 并行编程时 不需要依赖第三方库 而且在原子操作中还引入了 原子类 的概念。要使用标准库中的线程&#xff0c;必须包含 < thread > 头文件 函数名 功能 thread() 构造一个线程对象…...

安卓修改SwitchCompat色值

SwitchCompat控件色值跟系统设置的主题有关&#xff0c;但是主题效果不是能轻易就能改的&#xff0c;因为涉及到整个APP的样式。网上方案基本都是通过修改style文件来改变色值&#xff0c;经过多次尝试修改最终觉得单独修改控件色值比较好。 一、控件属性 //修改开关色值就是最…...

pytorch内存泄漏

问题描述&#xff1a; 内存泄漏积累过多最终会导致内存溢出&#xff0c;当内存占用过大&#xff0c;进程会被killed掉。 解决过程&#xff1a; 在代码的运行阶段输出内存占用量&#xff0c;观察在哪一块存在内存剧烈增加或者显存异常变化的情况。但是在这个过程中要分级确认…...

20230821-字符串相乘-给树命名(unordered_map)

字符串相乘 有两个非负整数字符串num1&#xff0c;num2&#xff0c;计算num1和num2所表达整数的乘积&#xff0c;结果以字符串形式存储。注意:不能通过强制转换方法解题。 示例1&#xff1a; 输入&#xff1a; "4", "3" 输出&#xff1a; "12" …...

[Go版]算法通关村第十二关黄金——字符串冲刺题

目录 题目&#xff1a;最长公共前缀解法1&#xff1a;纵向对比-循环内套循环写法复杂度&#xff1a;时间复杂度 O ( n ∗ m ) O(n*m) O(n∗m)、空间复杂度 O ( 1 ) O(1) O(1)Go代码 解法2&#xff1a;横向对比-两两对比&#xff08;类似合并K个数组、合并K个链表&#xff09;复…...

neovim为工作区添加本地clangd配置

1 背景 尝试使用neovim开发stm32&#xff0c;使用clangd作为LSP提供代码补全等功能。 2 思路 使用stm32cubeMX生成一个基于makefile的stm32工程。 使用bear或compiledb基于makefile生成compile_commands.json文件。 为clangd配置--query-driver选项&#xff0c;使其使用arm…...

信号处理--基于EEG脑电信号的眼睛状态的分析

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

Redis高可用:主从复制详解

目录 1.什么是主从复制&#xff1f; 2.优势 3.主从复制的原理 4.全量复制和增量复制 4.1 全量复制 4.2 增量复制 5.相关问题总结 5.1 当主服务器不进行持久化时复制的安全性 5.2 为什么主从全量复制使用RDB而不使用AOF&#xff1f; 5.3 为什么还有无磁盘复制模式&#xff…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

剑指offer20_链表中环的入口节点

链表中环的入口节点 给定一个链表&#xff0c;若其中包含环&#xff0c;则输出环的入口节点。 若其中不包含环&#xff0c;则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

【碎碎念】宝可梦 Mesh GO : 基于MESH网络的口袋妖怪 宝可梦GO游戏自组网系统

目录 游戏说明《宝可梦 Mesh GO》 —— 局域宝可梦探索Pokmon GO 类游戏核心理念应用场景Mesh 特性 宝可梦玩法融合设计游戏构想要素1. 地图探索&#xff08;基于物理空间 广播范围&#xff09;2. 野生宝可梦生成与广播3. 对战系统4. 道具与通信5. 延伸玩法 安全性设计 技术选…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...