Java AOP的底层原理

【JAVA基础】AOP详解 AOP(Aspect OrientedProgramming):面向切面编程,面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 阅读详情

一、什么是AOP?

1.AOP:Aspect Oriented Programming(面向切面编程),OOP是面向对象编程,AOP是在OOP基础之上的一种更高级的设计思想。

2.OOP和AOP之间也存在一些区别,OOP侧重于对象的提取和封装。—封装对象

AOP侧重于方面组件,方面组件可以理解成封装了通用功能的组件,方面组件可以通过配置方式,灵活地切入到某一批目标对象方法上。—封装功能

3.AOP用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等。

二、AOP代理

1.AOP实现的关键,在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。

2.使用AspectJ的编译时增强,实现AOP。

之前提到,AspectJ是静态代理的增强。所谓的静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。

3.举个实例来说。首先我们有一个普通的Hello类:

public class Hello {
public void sayHello() {
System.out.println("hello");
}
public static void main(String[] args) {
Hello h = new Hello();
h.sayHello();
}

}

4.使用AspectJ编写一个Aspect:

public aspect TxAspect {
void around:call(void Hello.sayHello()) {
System.out.println("开始事务。。。");
proceed();
System.out.println("结束事务。。。");
}

}

5.这里模拟了一个事务的场景,类似于Spring的声明式事务。使用AspectJ的编译器编译:

ajc -d . Hello.java TxAspect.aj

编译完成之后,再运行Hello类,可以看到以下输出:

1)开始事务。。。
2)hello

3)结束事务。。。

显然,AOP已经生效了。这就是AspectJ的静态代理,它会在编译阶段将Aspect织入Java字节码中,运行的时候就是经过增强之后的AOP对象。proceed方法就是回调执行被代理类中的方法。

三、使用Spring AOP

1.与AspectJ的静态代理不同,Spring AOP使用的是动态代理。所谓的动态代理,就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

2.Spring AOP中的动态代理,主要有两种方式:JDK动态代理和CGLIB动态代理。JDK动态代理通过“反射”来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。

3.CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态地生成某个类的子类。注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。

四、JDK动态代理

1.为了验证以上的说法,可以做一个简单的测试。首先测试实现接口的情况。

2.定义一个接口:

public interface Person {
void sayHello(String name);

}

3.实现类:

@Component
public class Chinese implements Person {
@Timer
@Override
public void sayHello(String name) {
System.out.println("-- sayHello() --"); 
};
public void eat(String food) {
System.out.println("我正在吃:" + food);
}

}

这里的@Timer注解,是自定义的一个普通注解,用来标记Pointcut。

4.定义Aspect:
@Aspect
@Component
public class AdviceTest {
@Pointcut("annotation(com.spring.aop.Timer)")
public void pointcut() {

}

@Before("pointcut()")
public void before() {
System.out.println("before");
}

}

5.运行:

@SpringBootApplication
@RestController
public class SpringBootDemoApplication {
// 这里必须使用Person接口做注入
@Autowired

private Person chinese;

@RequestMapping("/test")
public void test() {
chinese.sayHello("listen");
System.out.println(chinese.getClass());
}
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}

}

6.输出:

1)before
2)-- sayHello() --

3)class com.sun.proxy.$Proxy53

可以看到类型是class com.sun.proxy.$Proxy53,也就是前面提到的Proxy类,因此这里Spring AOP使用了JDK的动态代理。

五、CGLIB动态代理

1.再来看看不实现接口的情况,修改Chinese类:

@Component
public class Chinese {
@Timer
public void sayHello(String name) {
System.out.println("-- sayHello() --"); 
};
public void eat(String food) {
System.out.println("我正在吃:" + food);
}

}

2.定义Aspect。

3.运行:

@SpringBootApplication
@RestController
public class SpringBootDemoApplication {
// 直接用Chinese类注入
@Autowired

private Chinese chinese;

@RequestMapping("/test")
public void test() {
chinese.sayHello("listen");
System.out.println(chinese.getClass());
}
public static void main(String[] args) {
SpringApplication.run(SpringBootDemoApplication.class, args);
}

}

4.输出:

1)before
2)-- sayHello() --

3)class com.spring.aop.Chinese$$EnhancerBySpringCGLIB$$56b89168

可以看到类被CGLIB增强了,也就是动态代理。这里的CGLIB代理就是Spring AOP的代理,这个类也就是所谓的AOP代理,AOP代理类在切点动态地织入了增强处理。

六、小结

1.AspectJ在编译时就增强了目标对象,Spring AOP的动态代理则是在每次运行时动态地增强,生成AOP代理对象。

2.区别在于生成AOP代理对象的时机不同,相对来说,AspectJ的静态代理方式具有更好的性能,但是AspectJ需要特定的编译器进行处理,而Spring AOP则无需特定的编译器处理。

金蝶云ERP远程办公指南:零公网IP实现安全内网穿透访问 本文详细介绍了如何利用内网穿透技术,在无需公网IP和复杂路由器设置的情况下,安全远程访问内网部署的金蝶云ERP系统。通过使用cpolar工具,逐步指导用户创建加密隧道、配置固定域名,并实现管理中心与数据中心的远程登录,有效解决了企业员工在外出或居家办公时的核心业务系统访问难题。 阅读详情

相关推荐

1. 基于STM32的1.28寸圆形IPS屏(GC9A01)驱动移植实战:软件SPI与硬件SPI双方案详解

本文详细介绍了如何在STM32平台上为1.28寸圆形IPS屏(GC9A01驱动芯片)移植驱动程序,涵盖软件SPI与硬件SPI两种实现方案。内容从引脚定义、工程搭建、GPIO配置到SPI外设初始化逐步详解,并提供了完整的测试代码,帮助开发者根据项目需求(灵活性或性能)选择合适的通信方式,快速点亮屏幕并集成到智能手表等嵌入式项目中。

weixin_42300144的博客 203

Java AOP篇

AOP,一般成为面向切面,作为面向对象OOP的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块之间的耦合度,提高了系统的可维护性。可用于权限认证,日志和事务处理.

wk3510的博客 1万+

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络

本文详细讲解了如何在RouterOS上利用网桥和VLAN功能,从零开始构建安全隔离的二层虚拟网络。通过分步实战演示,涵盖核心概念、网桥创建、PVID设置、VLAN规则配置及安全过滤,帮助网络管理员实现办公、访客与服务器网络的逻辑隔离与灵活管理,提升网络安全性。

u9v0w的博客 504

Java AOP的底层实现原理

一、什么是AOP 1、AOP:Aspect Oriented Programming(面向切面编程),OOP是面向对象编程,AOP是在OOP基础之上的一种更高级的设计思想。 2、OOP和AOP之间也存在一些区别,OOP侧重于对象的提取和封装。----封装对象 AOP侧重于方面组件,方面组件可以理解成封装了通用功能的组件,方面组件可以通过配置方式,灵活地切入到某一批目标对象方法上。----封装...

北风浊酒 909

Android dex, odex, oat, vdex, art文件介绍

下图可以简化将Java源转换为OAT的过程: .dex Dalvik虚拟机字节码文件 .vdex 其中包含APK的未压缩DEX代码,以及一些旨在加快验证速度的元数据 .odex .oat // JIT,Just-in-time,即时编译,边运行边编译; // AOT,Ahead Of Time,提前编译,指运行前编译。 其中包含APK中已经过AOT编译的方法代码。 原始DEX文件(例如classes.dex)被转换为另一个包含本机代码的文件。这个新文件通常具有.odex。.oat扩展名,并由ELF格式

he980725866的博客 3618

顺序功能图基本结构

顺序功能图(Sequential Function Chart,SFC)是一种用于描述工业控制系统中顺序控制流程的图形化编程语言,广泛应用于PLC(可编程逻辑控制器)编程。其核心思想是将复杂的控制流程分解为多个有序的步骤,通过逻辑条件实现步骤间的切换。顺序功能图通过图形化的方式简化了复杂控制逻辑的设计,尤其适用于需要严格顺序控制的工业自动化场景。[初始步] → 转换条件1 → [步1] → 转换条件2 → [步2] → ...[步X] → → [步B] → 转换条件B → → [合并步]

ayingqin1的博客 1224

Java中的AOP是什么?如何实现AOP

通过动态代理,应用程序可以在不修改其原始代码的情况下,将横切关注点从主要逻辑中分离出来,从而实现更高的可重用性和可维护性。通过使用AOP,开发人员可以更轻松地实现应用程序的横切关注点,从而提高应用程序的可重用性和可维护性,并且更好地管理和组织代码。AOP是一种编程范式,它使开发人员能够在不改变应用程序原有逻辑的情况下,将横切关注点(例如日志记录、事务管理、安全性等)从应用程序的主要逻辑中分离出来。总之,AOP是一种非常有用的软件设计模式,它可以帮助我们更好地管理和组织代码,从而提高软件的质量和可维护性

2301_77769537的博客 2189

yolov8 PTQ和QAT量化实战(源码详解)

量化():是指将高精度浮点数(FP32)转换为低精度(8bit或4bit)整数的过程,它是模型部署中的一种非常重要的优化方法,可以在较少的精度损失下,大幅提供神经网络的效率和性能。目前主流的神经网络量化方式有PTQ和QATPTQ是训练后量化(),无需数据集和训练,直接量化模型权重QAT是量化感知训练(),量化后需要在数据集上继续微调训练。QAT过程中,我们首先需要选择哪些层需要进行finetune训练,并利用FP32对应层的输出作为监督进行训练。

@bangbang的博客 5326

Java AOP详解

AOP 核心:通过切面分离横切关注点,提升代码模块化。Spring AOP:基于动态代理,适合方法级拦截。AspectJ:功能更强大,适合复杂场景。关键注解@Aspect@Pointcut@Before@Around等。通过掌握以上内容,可以灵活应用 AOP 解决实际开发中的横切关注点问题,并结合 Spring 或 AspectJ 框架实现高效解耦。

m0_65181864的博客 2912

L2CAP 面向连接信道(CoC)在 BLE 中的应用:建立、流控与数据传输

L2CAP(逻辑链路控制与适配协议)是蓝牙协议栈中的核心层,位于基带层之上,为上层协议提供数据传输服务。在低功耗蓝牙(BLE)中,L2CAP面向连接信道(Connection-Oriented Channel, CoC) 是实现可靠数据传输的关键机制,广泛应用于健康监测、智能家居、工业控制等领域。

byte轻骑兵的技术小窝 3632

从 SAP GUI 走向 SAP Fiori:一套面向 SAP S/4HANA 的用户迁移实战方法论

SAP S/4HANA转型中,用户从SAP GUI迁移到Fiori的难点在于业务价值的重构而非简单的界面替换。Fiori的核心价值在于角色化、实时洞察和智能决策,而非完全替代GUI。成功迁移需分阶段推进:先展示关键角色的价值,建立统一入口,再逐步提高Fiori占比。让用户参与设计比后期培训更重要,需通过具体场景(如采购优先级管理)展示效率提升。迁移策略应平衡新旧界面优势,让Fiori成为业务价值触达的主要方式,而非强制替换。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 235

JAVA-AOP底层原理

JDK动态代理流程大概是在类加载过程中会动态生成代理类Proxy,他是在内存直接生成字节码并通过类加载器加载到JVM中,然后再类的初始化的过程,代理类会实现目标类的接口并持有一个InvocationHandler接口的实例,然后再调用代理对象方法的时候,JVM会将其转发到InvocationHandler的invoke()方法中,然后执行切面逻辑和目标方法的调用,当代理对象不再被引用的时候,JVM的垃圾回收期会将其标记为可回收对象,并回收其内存。

qq_74763440的博客 862

超硬核实操!DeepSeek 全方位赋能嵌入式工程师,干货满满

摘要:本文聚焦 DeepSeek 大语言模型在嵌入式开发中的实操应用。开篇阐述其在开发前期助工程师精准理解需求、规划架构;代码编写阶段,可生成补全代码、助力算法实现与优化;调试测试时,能定位问题、生成测试用例;学习阶段,帮整理资料、规划学习路径。文中借助 Python 实现与模型交互,提供大量实操流程与代码示例。虽存在不足,但实操彰显其巨大潜力,为嵌入式工程师提供高效工作新思路与全面实操指南。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2001

一文讲解Java中AOP的底层原理

一文讲解Java中AOP的底层原理

Kerwin_D的博客 1816

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

被遗漏的AOP原理与底层---JAVA必须学的底层技术

AOP(面向切面编程,Aspect-Oriented Programming)是Java中一种用于横切关注点分离的编程范式。通过AOP,可以将日志记录、安全检查、事务管理等与业务逻辑无关的代码从业务逻辑中分离出来,提高代码的可维护性和可重用性。

zhang9880000的博客 814

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java深入理解AOP(什么是AOP,AOP底层实现原理、应用)

一、什么是AOP 1、AOP:Aspect Oriented Programming(面向切面编程),OOP是面向对象编程,AOP是在OOP基础之上的一种更高级的设计思想。 2、OOP和AOP之间也存在一些区别,OOP侧重于对象的提取和封装。----封装对象 AOP侧重于方面组件,方面组件可以理解成封装了通用功能的组件,方面组件可以通过配置方式,灵活地切入到某一批目标对象方法上。----封装功能 3、AOP用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等。 二、AOP代理 1.AOP实现

Lifelong learning 1万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java动态代理——AOP的底层原理

目 录Spring5中的AOP底层原理中的动态代理案例反射中的动态代理案例 Spring5中的AOP底层原理中的动态代理案例 package com.atguigu.spring5; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.SQLOutput; import java.util.Arrays;

weixin_46515047的博客 265

JAVA框架 Spring AOP底层原理

一:AOP(Aspect Oriented Programming)面向切面编程。 底层实现原理是java的动态代理:1、jdk的动态代理。2、spring的cglib代理。 jdk的动态代理需要被代理的对象有接口。 代码例子: 转载于:https://www.cnblogs.com/evilliu/p/8874374.html...

weixin_30433075的博客 86

底层实现_Java AOP的底层实现原理

AOP用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等。AOP实现的关键,在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。静态代理 AspectJAspectJ是什么?Eclipse AspectJ is a seamless aspect-oriented extension ...

weixin_35326667的博客 133

Java开发大型互联网架构Spring AOP实现原理之Spring AOP底层实现

什么是 AOP AOP(Aspect-Oriented Programming), 即 面向切面编程, 它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是 Aspect(切面) AOP的基本概念 AOP框架具有如下两个特征: 个步骤之间的良好隔离性。 源代码无关性。 AOP concepts(AOP术语) Aspect/Advi

程序员Monkey的专栏 2093

(十九)Core Java 加载器及Spring底层AOP原理实现 (117)

 目录 :        1 ) .  类加载器及其委托机制的深入分析2 ) .  自定义加载器的编写原理分析3 ) .  编写对class文件进行加密的工具类4 ) .  编写和测试自己编写的解密类加载器5 ) .  类加载器的一个高级问题的实验分析6 ) .  分析代理类的作用与原理和AOP概念7 ) .   创建动态类及查看其方法列表信息8 ) . 创建动态类的实例对象及调用其方法9 ). ...

modaiairen524的博客 475

【Spring AOP】AOP 底层实现原理 ,java大学实用教程第四版作业题答案

POP (Producer Oriented Programing) 面向过程(方法、函数)编程 —— C 以过程为基本单位的程序开发,通过过程间的彼此协同,相互调用,完成程序的构建。 OOP (Object Oritened Programing) 面向对象编程 —— Java 以对象为基本单位的程序开发,通过对象间的彼此协同,相互调用,完成程序的构建。 AOP (Aspect Oriented Programing) 面向切面编程 = Spring动态代理开发 以切面为基

m0_64867435的博客 286

依赖注入底层反射原理_java中SSM框架面试题,IOC和AOP底层实现原理

大家都知道,随着科学技术水平的不断变革与发展,人们对于新技术的学习也越来越积极主动。尤其是关于java的学习更是成为了热门的编程语言。今天就来为大家介绍java中SSM框架面试题,IOC和AOP底层实现原理。一起来了解一下吧。首先说一下,IOC底层实现原理概念:IOC是面向对象编程中的一种设计原则,IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。所谓IOC,对于...

weixin_39743064的博客 290

Java spring框架-AOP(底层原理+入门)II

spring 为什么要学习Spring框架 方便解耦,简化开发 通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。 有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。 AOP编程的支持 通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。 声明式事务的支持 在Spring中,我们可以从单调烦闷的事务管理代码中解脱出

javascr_的博客 304

Java反射与动态代理:Spring AOP底层原理揭秘

本文系统介绍了Java反射机制与动态代理技术。反射允许程序运行时获取类信息并操作对象,核心是通过Class对象访问构造器、成员变量和方法(包括私有成员通过setAccessible)。动态代理基于反射实现,通过Proxy.newProxyInstance生成代理对象,在InvocationHandler中增强目标方法,实现AOP功能。JDK动态代理要求目标类必须实现接口,是Spring AOP的底层基础。两种技术虽灵活但存在性能损耗,是理解主流框架原理的关键。

2601_96029214的博客 527

动态代理——Java实现(AOP底层原理)

代理模式 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。可以参阅《大话设计模式》学习代理模式。 静态代理 ​ 由程序员创建或特定工具自动生成源代码,也就是在编译时就已经将接口、被代理类、代理类等确定下来。在程序运行之前,代理类的.class文件就已经生成。 动态代理 ​ **代理类在程序运行时创建的代理方式被成为动态代理。**动态代理,代理类并不是在Java代码中定义的,而是

Simon的博客 437
上一篇: HTTP适配层
下一篇: Idea开发环境搭建
Spring_Lws
博客等级 码龄8年 110粉丝 35原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值