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 AspectJ​projects.eclipse.orgAspectJ 入门​www.jianshu.com

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

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

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


动态代理(Spring AOP)

Spring AOP官方文档

Core Technologies​docs.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的底层实现原理相关推荐

  1. AOP的底层原理:动态代理

    AOP的底层原理:动态代理 使用动态代理时会生成一个动态代理类 动态代理类是在程序运行期间由jvm通过反射等机制动态生成的. 所以不存在代理类的字节码文件(因为没有经历编译阶段),代理对象和真实对象的 ...

  2. 什么是AOP,AOP的底层实现原理

    什么是AOP?AOP的底层实现 1.什么是AOP AOP(Aspect Oritented Programing) 面向切面编程. AOP采取横向抽取机制,取代了传统的继承纵向继承体系的重复性代码(性 ...

  3. (转)Spring AOP的底层实现技术

    AOP概述 软件的编程语言最终的目的就是用更自然更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,我们看到编程语言在一步步用更自然.更强大的方式描述软件.AOP是软件开发思想的一个飞跃 ...

  4. aop简介-aop的底层实现

    实际上,AOP 的底层是通过 Spring 提供的的动态代理技术实现的.在运行期间,Spring通过动态代理技术动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完 ...

  5. PHP之AOP面向切面编程原理(2)

    在传统的编写业务逻辑处理代码时,我们通常会习惯性地做几件事情:日志记录.事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码.当代码编写完成回头再看时,不禁发现,扬扬洒洒上百行代码中,真正用于核心 ...

  6. 【深度挖掘 RocketMQ底层源码】「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-下)

    承接[[深度挖掘 RocketMQ底层源码]「底层源码挖掘系列」透彻剖析贯穿RocketMQ的消费者端的运行核心的流程(Pull模式-上)] pullBlockIfNotFound方法 通过该方法获取 ...

  7. 15-Spring AOP的底层实现原理JDKProxyCGLIB

    前一篇:14-Spring AOP编程https://blog.csdn.net/fsjwin/article/details/109480097 前面我们讨论动静态理的时候说过,想要实现动态代理需要 ...

  8. java nio底层实现_Java NIO 底层原理

    一.概念说明 1.内核态(内核空间)和用户态(用户空间)的区别和联系? 用户空间是用户进程所在的内存区域,系统空间是操作系统所在的内存区域.为了保证内核的安全,处于用户态的程序只能访问用户空间,而处于 ...

  9. java底层模型_Java I/O模型及其底层原理,夯实你的开发基础

    前言 Java I/O是Java基础之一,在面试中也比较常见,在这里我们尝试通过这篇文章阐述Java I/O的基础概念,帮助大家更好的理解Java I/O. 在刚开始学习Java I/O时,我很迷惑, ...

最新文章

  1. intent和手势探测
  2. 转载:left join和left semi join的联系和区别
  3. 寻找峰值(局部最大、局部最小)——二分查找
  4. Java ArrayList isEmpty()方法与示例
  5. 万能客服公众号版-聚合客服小程序功能模块V28.1.0
  6. 一致性Hash简单介绍和使用
  7. Laravel学习笔记四-数据库迁移和模型文件
  8. Windows服务器搭建Redis
  9. Struts2拦截器详解
  10. 基于matlab的电池管理系统开发,基于MATLAB的锂电池组均衡仿真系统设计
  11. 绘制柱状图,填充不同颜色
  12. 【竞品分析】腾讯QQ手机浏览器与UC手机浏览器产品对比
  13. 不知道是真是假的流量购买---有待考察
  14. VUE.js组件通信精髓归纳(基础篇)
  15. Android 3年外包工面试笔记,有机会还是要去大厂学习提升
  16. 最简单的python使用ddddocr模块在线识别验证码后登录
  17. oracle数据库的blob和clob类型,是什么意思和区别
  18. Python开发一个炸金花小游戏,注意别玩上瘾了
  19. 笑傲江湖手3D有服务器端文件,笑傲江湖网游单机版
  20. Cross-validation\cross_val_score\鲁棒性

热门文章

  1. Microsoft Visual C++ Runtime Library 错误解决办法
  2. WinSCP中文版FTP工具 V5.19.5
  3. Linux利用nginx-gridfs搭建部署Nginx和MongoDB文件服务器,支持用户密码验证!
  4. ztree 指定节点清空_节点操作
  5. python安装cv2模块_python - OpenCV已成功安装但未导入错误:没有名为“ cv2”的模块 - 堆栈内存溢出...
  6. 合成孔径雷达_合成孔径雷达(SAR)基础:汇总
  7. windows下python环境搭建_Linux/Windows下Python环境搭建步骤
  8. 一个柱状图里两种数据_分享一些数据分析常用的统计图图表
  9. PP视频如何设置默认缓存个数
  10. wex5 app应用 定时退出