Spring:Spring实现AOP的通俗理解(有源码跟踪)

Java后端面试7天冲刺:从八股文到实战的系统复习指南 这次我们来看一个针对Java后端面试的八股文学习项目。这个项目号称“7天刷完面试所需的Java后端八股文,面试通过率95%”,覆盖了从Java基础、并发编程、JVM、MySQL到Spring全家桶等核心后端技术栈,并包含了场景题。对于正在准备面试的开发者来说,这听起来像是一个高效、集中的复习方案。 本文的核心不是讨论“7天”是否足够,而是拆解这个学习路径的可行性、内容结构,以及如何将其转化为可执行的、高效的复习计划。我们将重点关注这套八股文的知识体系完整性、学习节奏安排、以及如何结合实践进行巩固,最终目标是 阅读详情

AOP定义

  • AOP (Aspect Orient Programming):直译过来就是 面向切面编程。AOP 是一种编程思想
  • 用途:
  • Transactions (事务调用方法前开启事务, 调用方法后提交关闭事务 )、日志、性能(监控方法运行时间)、权限控制等。也就是对业务方法做了增强

SpringAOP和AspectJ联系

  • Spring AOP旨在通过Spring IoC提供一个简单的AOP实现,以解决编码人员面临的最常出现的问题。这并不是完整的AOP解决方案,它只能用于Spring容器管理的beans。
  • AspectJ是最原始的AOP实现技术,提供了完整的AOP解决方案。
    • 简单的:spirng aop够用了,但是spring aop借助了aspectj的注解功能,需要添加aspectj的依赖。
    • 在高级点,比如切面很多,上万个,这是就要用到aspectj的高级功能了
  • 在Spring的框架中包含Aspectj,当然也包括Spring AOP,在进行开发时候,这两个框架是完全兼容的
  • 区别:
    • AspectJ使用的是编译期和类加载时进行织入
    • Spring AOP利用的是运行时织入

Spring如何实现AOP

AOP的代理对象

都知道AOP是通过代理对象实现对对象功能的增强,代理对象分为静态代理和动态代理

静态代理

  • 需要定义接口、目标对象与代理对象
  • 代理类需要对代理对象的每个方法有对应方法
  • 优点
    • 也就是代理模式的优点,可以在被代理方法的执行前或后加入别的代码,实现诸如权限及日志的操作
    • 不是运行时生成的代理,效率更高
  • 缺点
    • 如果代理对象增加一个方法,所有代理类也需要实现此方法

动态代理

  • 动态代理类的源码是在程序运行期间由JVM根据反射等机制动态织入的
  • 不存在代理类的字节码文件,直接进了虚拟机
  • 通过proxy提供了一组静态方法来为一组接口动态地生成代理类及其对象。
// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器
static InvocationHandler getInvocationHandler(Object proxy)
// 方法 2:该方法用于获取关联于指定类装载器和一组接口的动态代理类的类对象
static Class getProxyClass(ClassLoader loader, Class[] interfaces)
// 方法 3:该方法用于判断指定类对象是否是一个动态代理类
static boolean isProxyClass(Class cl)
// 方法 4:该方法用于为指定类装载器、一组接口及调用处理器生成动态代理类实例
static Object newProxyInstance(ClassLoader loader, Class[] interfaces,InvocationHandler h)

注意newProxyInstance方法,接收的三个参数依次为:
ClassLoader loader, :指定当前目标对象使用类加载器 ;负责将类的字节码装载到 Java 虚拟机(JVM)中并为其定义类对象
Class<?>[] interfaces, :目标对象实现的接口的类型,使用泛型方式确认类型
InvocationHandler h :事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行目标对象的方法作为参数传入

InvocationHandler,这是调用处理器接口,它自定义了一个 invoke 方法,在该方法中实现对目标类的代理访问。

public interface InvocationHandler {
//第一个参数既是代理类实例
//第二个参数是被调用的方法对象
// 第三个方法是调用参数
	Object invoke(Object proxy, Method method, Object[] args)
}

所以实现动态代理,我们就需要创造一个类实现InvocationHandler接口,并且实现invoke方法

@Override
public Object invoke(Object object, Method method, Object[] args)
throws Throwable {
//********************方法前增强***************************
// 反射调用目标方法
	return method.invoke(obj, args);
//********************方法后增强***************************
}

首先创建目标对象,将对象作为参数传给实现InvocationHandler接口的类的实例对象,然后
使用Proxy.newProxyInstance()方法,将参数传入进去生成动态代理对象。

优点:

  • 相比静态代理,动态代理减只需要实现一个接口即可完成,而静态代理每次都要实现新加的方法以及维护被代理方法

AOP的代理对象生成过程

  • 在处理循环依赖的时候,放入三级缓存的是ObjectFactory(一个lambda表达式,用来生成bean对象的半成品对象)。因为对象可能需要被代理所以,所以放入三级缓存的是一个ObjectFactory,而不是一个半成品bean。
  • 所以AOP的代理是在后置处理器处生成的,也就是AbstractAutoProxyCreator实现了BeanPostProcessor接口。
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {}

通过postProcessAfterInitialization方法,实现目标对象的动态代理

	//如果当前的bean适合被代理,则需要包装指定的bean
	@Override
	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) throws BeansException {
		if (bean != null) {
			// 根据给定的bean的class和name构建一个key
			Object cacheKey = getCacheKey(bean.getClass(), beanName);
			if (!this.earlyProxyReferences.contains(cacheKey)) {

				// 如果当前的bean适合被代理,则需要包装指定的bean
				return wrapIfNecessary(bean, beanName, cacheKey);
			}
		}
		return bean;
	}

向下的过程依次是

  • wrapIfNecessary
    • createProxy
      • proxyFactory.getProxy
        • ProxyCreatorSupport#createAopProxy() 判断是使用JDK代理还是CGLIB代理
          • 上面选择的AopProxy的getProxy方法
            • Proxy.newProxyInstance

到此代理对象生成之后被放入一级缓存中。

Java后端高效学习路径:场景驱动,从八股文到实战能力 如果你是一名Java后端开发者,正在为“如何高效学习、快速进步”而焦虑,这篇文章就是为你准备的。我们经常陷入一个误区:面对海量的技术栈——从Java基础、JVM、MySQL、Spring到分布式、AI大模型——感觉什么都得学,却又不知从何下手,最终在“收藏-吃灰”的循环中原地踏步。 问题的核心不在于资料太少,而在于 缺乏一个能串联所有知识点、并能直接转化为面试和实战能力的系统性路径 。很多人把时间花在了“背八股文”上,却忽略了面试官真正想考察的: 你是否能用这些知识解决真实的业务问题 。 本文将为你拆解一条 阅读详情

相关推荐

AI时代Java程序员的核心竞争力:从CRUD到架构师的价值跃迁

在软件开发领域,并发编程和JVM调优是构建高性能、高可用系统的核心技术基础。并发编程通过多线程、锁机制和并发工具包,解决了资源共享与竞争问题,是应对高并发场景的核心手段。JVM作为Java应用的运行环境,其内存管理、垃圾回收机制直接影响着应用的吞吐量和延迟,深度调优能显著提升系统稳定性。这些技术的价值在于,它们赋予了开发者从代码实现者向系统架构师转变的能力,使其能够设计出支撑海量请求、具备弹性伸缩能力的复杂分布式系统。在AI辅助编码日益普及的当下,掌握并发编程与JVM调优等底层原理,成为Java开发者构建不

weixin_34038293的博客 356

spring核心之AOP设计原理及实现分析

目录 AOP及Spring AOP原理介绍 AOP使用场景 spring AOP基础概念和核心类介绍 深入源码分析之创建代理对象 深入源码分析之代理对象AOP拦截器调用实现 AOP及Spring AOP原理介绍 通俗简单地理解,aop的原理是:在代码编译或项目启动运行的时候生成代理对象,代理对象糅合了被拦截方法和切面逻辑方法的执行。 AOP 实现的关键就在于 AOP 框架自动创建的...

gufachongyang02的专栏 1570

ISO26262 功能安全各个阶段测试要求

1. 开发过程说明 系统层面:包括软硬件集成测试、系统集成测试以及整车测试。 硬件层面:包括硬件集成与测试。 软件层面:单元测试、集成测试。 2. 功能安全总体要求 2.1 各项指标 2.2 诊断覆盖度举例 针对一个信号举例说明: 3. 功能安全测试要求 3.1 测试计划 核心内容应包括, 测试对象:需要测试的对象描述,以及测试的范围描...

AgingMoon的博客 1万+

再战spring源码——序章

最后,用通俗易懂的语言再讲一遍核心内容,降低学习门槛,方便基础较薄弱的同学也能理解和掌握。通过类比、图示等方式,将复杂的概念转化为易于理解的内容。本博客的写作思路是"由浅入深,由表及里",既保证技术深度,又兼顾可读性。虽然不同层次的读者都能在这里得到收获,但本博客旨在让那些多次战败于阅读源码的人,找到一种能够坚持走到最后的方法。

weixin_44250106的博客 970

SAP 销售订单及发票 利润中心替代 Userexit出口 配置及程序

在跨公司销售业务中,跨公司销售订单的发票时无法从销售订单中将利润中心带到发票中,所以在跨公司的发票创建过程中需要配置出口来获取对应销售订单行项目的利润中心。 事务代码: 0KEM 配置步骤: 1、创建一个新的替代 2、创建一个步骤 3、维护一个先决条件,比如针对于特定工厂 PCASUB-VKBUR = '0001' 4、选择替代程序FORM,FORM必须为指定程序中存在的FORM名 5、编辑替代程序FORM 实现效果: 在程序FORM中打上断点 ...

李威威wiwi的博客 5069

CHIP-Seq数据分析流程

文章目录CHIP-Seq数据分析流程相关软件安装数据下载将SRA转化为fastq文件数据质控,过滤数据质控然后进行质控,过滤低质量reads,去接头比对下载小鼠参考基因组的索引和注释文件比对sam文件转bam为bam文件建立索引载入IGV查看用MACS call peak安装MACS结果注释与可视化 CHIP-Seq数据分析流程 相关软件安装 所需要的软件有sratoolkit, fastqc,bowtie2,samtools,macs2,htseq-count,bedtools和前面RNA-seq数据分析

bio_meimei的博客 8788

《Java 100 天进阶之路》第79篇:Spring源码阅读技巧(2026版)

摘要:Spring源码超过150万行,硬啃等于在迷宫里没有地图。一文掌握源码阅读五大黄金法则(先宏观再微观、线性理解数据流动、关注变量名、抓大放小、多遍阅读)、四大入口(refresh()/SpringApplication.run()/AnnotationConfigApplicationContext/具体功能点)、IDEA调试技巧大全(条件断点/日志断点/Evaluate Expression/Spring Debugger插件)、核心模块导航与关键类速查。附避坑清单、面试高频考点与追问陷阱。掌握方法

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 5495

Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定

本文为Fluent新手提供了遇到‘Floating point exception’错误时的7个详细排查步骤。从理解浮点异常的本质到边界条件检查、时间步长设置、求解器选择、网格优化、亚松弛因子调节以及高阶格式的取舍,帮助用户快速定位并解决问题,确保CFD仿真的稳定性和准确性。

weixin_30480075的博客 260

python aop编程_学习笔记: AOP面向切面编程和C#多种实现

AOP:面向切面编程 编程思想OOP:一切皆对象,对象交互组成功能,功能叠加组成模块,模块叠加组成系统类--砖头 系统--房子类--细胞 系统--人面向对象是非常适合做大型系统应对需求变化扩展的时候,比较困难;面向对象是静态的:任何需求的细微变化,都可能导致比较大的影响设计模式:设计出灵活 可扩展 可重用 的架构 可以解决部分问题都在折腾抽象/类永远无法解决类的内部变化 ...

weixin_31256263的博客 406

《派出你的AI同事:WorkBuddy案例实战》067:按行业分类的案例索引

按行业分类的案例索引 —— 《派出你的AI同事:WorkBuddy案例实战》系列文章,配图已统一为规范示意图。

LuckyHanMo的博客 96

[关系图谱] 二.Gephi导入共线矩阵构建作者关系图谱

本文主要讲解Gephi绘制作者间的关系图谱,该软件可以广泛应用于社交网络、知识图谱分析,推荐读者使用。这是非常基础的一篇文章,重点讲解Gephi使用方法,希望对大家有所帮助。

杨秀璋的专栏 1万+

☘ 一步一步带你理解 Spring 循环依赖

☘ Spring 循环依赖 ???? 什么是循环依赖? 举个栗子???? /** * A 类,引入 B 类的属性 b */ public class A { private B b; } /** * B 类,引入 A 类的属性 a */ public class B { private A a; } 再看个简单的图: 像这样,创建 a 的时候需要依赖 b,那就创建 b,结果创建 b 的时候又需要依赖 a,那就创建 a,创建 a 的时候需要依赖 b,那就创建 b,结果创建 b 的时候又需

Suremotoo的博客 342

【ARM AMBA5 CHI 2 -- CHI 链路层详细介绍 】

目前有六个版本的 CHI 协议,CHI-A 是 CHI 协议的第一个版本。它提供了一个传输层,具有减少拥塞的功能。新通道、CHI 术语和组件命名的定义;请求、监听过滤器和缓存状态转换的示例;事务排序、独占访问和分布式虚拟内存(DVM)操作的规则;CHI-B 问题扩展了 CHI-A,但不能直接向后兼容 CHI-A。更大的物理地址宽度;原子事务;DVM 的 VMID 扩展;通道字段、事务结构和可靠性、可用性和可维护性(RAS)特性的描述;

CodingCos的博客 2535

Java面试知识树构建指南:从核心原理到系统设计

在Java技术生态中,掌握核心原理与构建系统化知识体系是开发者进阶的关键。理解JVM内存模型、垃圾回收机制及并发编程基础,能从根本上提升应用性能与稳定性。深入集合框架、Spring等主流框架的源码设计,则有助于在工程实践中做出更优的技术决策。这些底层知识和高频技术点的融会贯通,对于应对分布式系统、高并发场景及复杂系统设计等挑战具有重要价值。本文以“知识树”为核心框架,系统梳理了从Java基础、JVM、主流框架到数据库、缓存、消息队列乃至分布式系统的完整知识链路,旨在帮助开发者构建清晰、牢固的技术体系,直击面

weixin_33730836的博客 342

2026年经典爬虫案例专栏|第17篇:学术论文爬虫实战——知网与万方数据采集

字段名说明数据类型title论文标题字符串authors作者列表列表abstract摘要字符串keywords关键词列表列表journal发表期刊字符串year发表年份整数volume卷号字符串issue期号字符串pages页码范围字符串citations引用次数整数downloads下载次数整数doiDOI编号字符串url论文链接字符串学术论文爬虫是科研工作的重要辅助工具,可以帮助研究人员高效地收集和管理论文数据。

2201_76125261的博客 1061

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java面试突击指南:高效备战核心考点与实战验证

在软件开发领域,Java作为主流编程语言,其技术栈的深度和广度是面试考察的重点。理解Java虚拟机(JVM)的内存管理、垃圾回收机制以及并发编程的核心原理,是构建高性能、高可用系统的基石。这些底层知识不仅决定了程序的运行效率,也直接影响着系统的稳定性和扩展性。从技术价值看,掌握JVM调优和并发控制能有效解决线上OOM、死锁等常见生产问题,提升应用性能。在应用场景上,无论是互联网高并发业务,还是企业级复杂系统,扎实的Java基础、对Spring框架的深入理解以及对MySQL索引与事务的优化能力,都是工程师的核

weixin_34232744的博客 415

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

AI时代Java工程师进阶指南:聚焦并发、JVM与系统设计构建核心竞争力

在软件开发领域,并发编程是处理多任务同时执行的核心技术,它通过线程管理、锁机制和同步工具来确保数据一致性与系统性能。其原理基于操作系统调度与Java内存模型,旨在提升资源利用率和响应速度。这项技术的价值在于支撑高并发、低延迟的互联网服务,是构建电商、金融交易等大规模系统的基石。随着AI辅助编程工具的普及,基础代码生成效率大幅提升,工程师更需深入理解底层机制。本文聚焦Java生态,探讨在AI赋能下,如何将精力集中于并发编程、JVM调优、MySQL深度优化等AI难以替代的硬核领域,通过掌握JUC工具包、GC算法

weixin_30883311的博客 425

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Java高级程序员分享书籍

工欲善其事必先利其器,同理,在学习Java的过程中,有一份优秀的学习资料,能够让我们的学习变得更加简单,那么在工作中的Java高级程序员都在看哪些书籍呢? 1、《Java Web开发实战》 本书以提升读者实战技能作为编写目标,使用通俗易懂的语言、丰富多样的实例,对Java Web开发涉及的核心技术进行了详细的讲解。涵盖了JDBC基础、JDBC进阶、DBUtils工具包、XML、Web开发前奏、HT...

qf2019的博客 298

2024年最全程序员必须知道的职场规则_程序员工作环境的职业形象与礼仪,字节跳动社招面试记录

在当今技术驱动的社会,程序员是高度需要的人才。然而,在职场中,技能和知识并不足以保证成功。程序员必须知道职场规则,以确保他们的工作得到适当的认可和奖励。职场规则是程序员工作中必须遵守的准则和要求,它们对于程序员的职业发展和个人形象至关重要。在程序员这个行业,除了技术实力之外,还需要具备一些基本的职场素养和礼仪来提升自己的工作能力和竞争力,那么本文就来聊一下。

jiameih的博客 741

大厂面试必问!java容器都有哪些

前言 今年的金三银四已经过去一大半了,在这其中参与过不少面试,2021都说工作不好找,这也是对开发人员的要求变向的提高了。 之前在Github上收获15K+star的Java核心神技(这参数,质量多高就不用我多说了吧)非常全面,包含基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等内容非常丰富,已经帮很多人拿下互联网一线公司的offer top1:Spring Cloud

m0_57286622的博客 310

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

掌舵亿级流量:Java技术总监的技能图谱与修炼之道

在Java技术栈的职业金字塔中,“技术总监”(Technical Director / VP of Engineering)是一个承上启下的关键枢纽。他既是技术深度的捍卫者,又是商业广度的开拓者。对于许多Java架构师而言,技术总监是突破“纯技术瓶颈”、实现职业价值跃迁的重要里程碑。

一火的专栏 323

java容器都有哪些,圆我大厂梦!

top1:Spring Cloud微服务实战 基础知识 微服务构建: Spring Boot 服务治理: Spring Cloud Fur eka 客户端负载均衡: Spring Cloud Ribbon 服务容错保护: Spring Cloud Hystrix 声明式服务调用: Spring Cloud Feian API网关服务: Spring Cloud Zuul 分布式配置中心: Spring Cloud Config 消息总线: Spring Cloud Bus 消息驱动的微服务: Sprin

m0_57501529的博客 120

Java面试八股文:从JVM并发到MySQL索引的进阶复习路线

在Java后端开发岗位的面试中,基础知识决定候选人的技术深度。JVM内存模型、并发编程、MySQL索引与事务、缓存一致性等话题,是面试官考察候选人系统工程能力的高频切入点。理解JVM的垃圾回收机制与类加载过程,掌握synchronized、volatile与AQS的底层原理,熟悉B+树索引与MVCC的协作方式,是构建完整知识体系的关键。从原理到实践,分布式系统与中间件组件(如Kafka、Redis)的性能设计思路同样值得深入探究。这套复习路线适用于准备跳槽或系统梳理Java服务端核心技能的开发者,帮助提升面

weixin_34050519的博客 388

三个月刷完阿里Java八股文1000道,我总结的实战刷题法

Java面试中的八股文常涉及集合、JVM、并发等基础概念。以HashMap为例,理解其扩容机制与红黑树化条件,比背诵默认值更能体现功底;JVM内存分区与垃圾回收原理,则是排查OOM问题的必备知识。掌握这些底层原理,不仅有助于应对大厂面试,更能指导日常调优与故障定位。在工程实践中,可通过每日定量刷题、费曼式复述和间隔复盘,将零散知识点串联成体系。以阿里巴巴Java八股文1000道为例,介绍一套可落地的刷题节奏与复盘方法,帮助开发者实现从理论到实战的迁移。

weixin_30367873的博客 349

langchain AI应用框架研究【核心概念-篇一】

langchain新版本1.1.0 出来了,老板了的api看了一些,api写法看起来有些凌乱,特别是那个构造chain的地方,先后顺序感觉不好记忆,还是SpringAI相对好好记忆一些。不知到1.x版本的会好使一些不。我们先来看看新版的langchain、langgraph、deepagents。LangChain 是一个用于开发由大语言模型(LLM)驱动的应用程序的开源框架。它的核心目标是提供一个统一的抽象层,让开发者可以方便地组合各种组件,而无需关心底层与不同模型API对接的细节。

yanghuashuiyue的专栏 597
上一篇: Mysql知识梳理(数据库的锁梳理,Mysql优化)
下一篇: NGINX相关的知识点
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝多芬也爱敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值