底层实现_Java AOP的底层实现原理
AOP用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等。
AOP实现的关键,在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。
静态代理 AspectJ
AspectJ是什么?
Eclipse AspectJ is a seamless aspect-oriented extension to the Java™ programming language. It is Java platform compatible easy to learn and use.
AspectJ是Java的扩展,用于实现面向切面编程。
AspectJ有自己的编辑器ajc,
AspectJ 官网
Eclipse AspectJprojects.eclipse.orgAspectJ 入门www.jianshu.com
使用AspectJ的编译时增强,实现AOP。
之前提到,AspectJ是静态代理的增强。所谓的静态代理,就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。
它会在编译阶段将Aspect织入Java字节码中,运行的时候就是经过增强之后的AOP对象。proceed方法就是回调执行被代理类中的方法。
动态代理(Spring AOP)
Spring AOP官方文档
Core Technologiesdocs.spring.io
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做动态代理的。
使用动态代理实质上就是调用时拦截对象方法,对方法进行改造、增强!
测试CGlib生成的动态代理
测试类
package com.example.demo.aop;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@RestController
//@EnableAspectJAutoProxy
public class SpringBootDemoApplication {// 直接用Chinese类注入@Autowiredprivate Landlord landlord;@RequestMapping("/test")public void test() {landlord.service();System.out.println(landlord.getClass());}public static void main(String[] args) {SpringApplication.run(SpringBootDemoApplication.class, args);}
}
Landlord类
package com.example.demo.aop;import org.springframework.stereotype.Component;@Component("landlord")
public class Landlord {public void service() {// 仅仅只是实现了核心的业务功能System.out.println("签合同");System.out.println("收房租");}
}
Broker类
package com.example.demo.aop.aspect;import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Component
@Aspect
class Broker {@Before("execution(* com.example.demo.aop.Landlord.service())")public void before() {System.out.println("带租客看房");System.out.println("谈价格");}@After("execution(* com.example.demo.aop.Landlord.service())")public void after() {System.out.println("交钥匙");}
}
运行结果
带租客看房
谈价格
签合同
收房租
交钥匙
class com.example.demo.aop.Landlord$$EnhancerBySpringCGLIB$$1f1c504a
Spring AOP就是这么简单啦juejin.imJava AOP的底层实现原理 - 健人雄 - 博客园www.cnblogs.comSpring(4)——面向切面编程(AOP模块)www.jianshu.com
底层实现_Java AOP的底层实现原理相关推荐
- AOP的底层原理:动态代理
AOP的底层原理:动态代理 使用动态代理时会生成一个动态代理类 动态代理类是在程序运行期间由jvm通过反射等机制动态生成的. 所以不存在代理类的字节码文件(因为没有经历编译阶段),代理对象和真实对象的 ...
- 什么是AOP,AOP的底层实现原理
什么是AOP?AOP的底层实现 1.什么是AOP AOP(Aspect Oritented Programing) 面向切面编程. AOP采取横向抽取机制,取代了传统的继承纵向继承体系的重复性代码(性 ...
- (转)Spring AOP的底层实现技术
AOP概述 软件的编程语言最终的目的就是用更自然更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,我们看到编程语言在一步步用更自然.更强大的方式描述软件.AOP是软件开发思想的一个飞跃 ...
- aop简介-aop的底层实现
实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的.在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完 ...
- PHP之AOP面向切面编程原理(2)
在传统的编写业务逻辑处理代码时,我们通常会习惯性地做几件事情:日志记录.事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码.当代码编写完成回头再看时,不禁发现,扬扬洒洒上百行代码中,真正用于核心 ...
- 【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-下)
承接[[深度挖掘 RocketMQ底层源码]「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-上)] pullBlockIfNotFound方法 通过该方法获取 ...
- 15-Spring AOP的底层实现原理JDKProxyCGLIB
前一篇:14-Spring AOP编程https://blog.csdn.net/fsjwin/article/details/109480097 前面我们讨论动静态理的时候说过,想要实现动态代理需要 ...
- java nio底层实现_Java NIO 底层原理
一.概念说明 1.内核态(内核空间)和用户态(用户空间)的区别和联系? 用户空间是用户进程所在的内存区域,系统空间是操作系统所在的内存区域.为了保证内核的安全,处于用户态的程序只能访问用户空间,而处于 ...
- java底层模型_Java I/O模型及其底层原理,夯实你的开发基础
前言 Java I/O是Java基础之一,在面试中也比较常见,在这里我们尝试通过这篇文章阐述Java I/O的基础概念,帮助大家更好的理解Java I/O. 在刚开始学习Java I/O时,我很迷惑, ...
最新文章
- intent和手势探测
- 转载:left join和left semi join的联系和区别
- 寻找峰值(局部最大、局部最小)——二分查找
- Java ArrayList isEmpty()方法与示例
- 万能客服公众号版-聚合客服小程序功能模块V28.1.0
- 一致性Hash简单介绍和使用
- Laravel学习笔记四-数据库迁移和模型文件
- Windows服务器搭建Redis
- Struts2拦截器详解
- 基于matlab的电池管理系统开发,基于MATLAB的锂电池组均衡仿真系统设计
- 绘制柱状图,填充不同颜色
- 【竞品分析】腾讯QQ手机浏览器与UC手机浏览器产品对比
- 不知道是真是假的流量购买---有待考察
- VUE.js组件通信精髓归纳(基础篇)
- Android 3年外包工面试笔记,有机会还是要去大厂学习提升
- 最简单的python使用ddddocr模块在线识别验证码后登录
- oracle数据库的blob和clob类型,是什么意思和区别
- Python开发一个炸金花小游戏,注意别玩上瘾了
- 笑傲江湖手3D有服务器端文件,笑傲江湖网游单机版
- Cross-validation\cross_val_score\鲁棒性
热门文章
- Microsoft Visual C++ Runtime Library 错误解决办法
- WinSCP中文版FTP工具 V5.19.5
- Linux利用nginx-gridfs搭建部署Nginx和MongoDB文件服务器,支持用户密码验证!
- ztree 指定节点清空_节点操作
- python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
- 合成孔径雷达_合成孔径雷达(SAR)基础:汇总
- windows下python环境搭建_Linux/Windows下Python环境搭建步骤
- 一个柱状图里两种数据_分享一些数据分析常用的统计图图表
- PP视频如何设置默认缓存个数
- wex5 app应用 定时退出