AOP底层原理解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: AOP底层原理解析

1 什么是AOP:


  1. AOP AspectOrientedPrograming面向切面编程
  2. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)
  3. Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
  4. AspecJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,
  5. AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入


2 AOP底层原理;


  1. 就是代理机制:
  2. *动态代理:(JDK中使用)
  • * JDK的动态代理,对实现了接口的类生成代理.


3 SpringAOP代理:


  1. JDK动态代理:对实现了接口的类生成代理
  2. CGLib代理机制:对类生成代理


4 AOP的术语:


  1. Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.
  2. Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
  3. Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
  4. Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态地添加一些方法或Field.
  5. Target(目标对象):代理的目标对象
  6. Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.

  7. Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
  8. Aspect(切面):是切入点和通知(引介)的结合



  1. spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入


  1. 对于不使用接口的业务类,无法使用JDK动态代理
  2. CGlib采用非常底层字节码技术,可以为一个类创建子类,解决无接口代理问题



图片.png


5 AOP的底层实现:

  5.1 JDK动态代理


  1. JDK1.3引入动态代理技术
  2. 编写动态代理程序
  3. java.lang.reflect.Proxy
  4. java.lang.reflect.InvocationHandler


  1. import java.lang.reflect.InvocationHandler;
  2. import java.lang.reflect.Method;
  3. import java.lang.reflect.Proxy;
  4. /**
  5. * @Title: JDK的动态代理的机制
  6. * @ClassName:JDKProxy.java
  7. * @Description:
  8. *
  9. * @Copyright2016-2017  Powered By 研发中心
  10. * @author: 王延飞
  11. * @date:2016919日 下午10:28:08
  12. * @version V1.0
  13. */
  14. publicclassJDKProxyimplementsInvocationHandler[]{
  15. privateUserDao userDao;
  16. publicJDKProxy(UserDao userDao){
  17. super();
  18. this.userDao = userDao;
  19. }
  20. publicUserDao createProxy(){
  21. UserDao proxy =(UserDao)Proxy.newProxyInstance(userDao.getClass()
  22. .getClassLoader(), userDao.getClass().getInterfaces(),this);
  23. return proxy;
  24. }
  25. // 调用目标对象的任何一个方法 都相当于调用invoke();
  26. publicObject invoke(Object proxy,Method method,Object[] args)
  27. throwsThrowable{
  28. if("add".equals(method.getName())){
  29. // 记录日志:
  30. System.out.println("日志记录=================");
  31. Object result = method.invoke(userDao, args);
  32. returnresult;
  33. }
  34. return method.invoke(userDao, args);
  35. }
  36. }


5.2 CGLIB动态代理

  1. 对于不使用接口的业务类,无法使用JDK动态代理
  2. CGlib采用非常底层字节码技术,可以为一个类创建子类,解决无接口代理问题
  3. import java.lang.reflect.Method;
  4. import org.springframework.cglib.proxy.Enhancer;
  5. import org.springframework.cglib.proxy.MethodInterceptor;
  6. import org.springframework.cglib.proxy.MethodProxy;
  7. /**
  8. * 使用CGLib生成代理对象
  9. *
  10. */
  11. publicclassCGLibProxyimplementsMethodInterceptor{
  12. privateProductDao productDao;
  13. publicCGLibProxy(ProductDao productDao){
  14. super();
  15. this.productDao = productDao;
  16. }
  17. publicProductDao createProxy(){
  18. // 使用CGLIB生成代理:
  19. // 1.创建核心类:
  20. Enhancerenhancer=newEnhancer();
  21. // 2.为其设置父类:
  22. enhancer.setSuperclass(productDao.getClass());
  23. // 3.设置回调:(相当于JDK动态代理中的回调)
  24. enhancer.setCallback(this);
  25. // 4.创建代理:
  26. return(ProductDao) enhancer.create();
  27. }
  28. /** * @param proxy CGlib根据指定父类生成的代理对象 * @param method 拦截的方法 * @param args 拦截方法的参数数组 * @param methodProxy 方法的代理对象,用于执行父类的方法 * @return    */
  29. publicObject intercept(Object proxy,Method method,Object[] args,
  30. MethodProxy methodProxy)throwsThrowable{
  31. if("add".equals(method.getName())){
  32. System.out.println("日志记录==============");
  33. //  放行代码:这里相当于JDK中的(method.invoke)
  34. Object obj = methodProxy.invokeSuper(proxy, args);
  35. return obj;
  36. }
  37. return methodProxy.invokeSuper(proxy, args);
  38. }
  39. }

 

5.3 代理总结

  1. Spring在运行期,生成动态代理对象,不需要特殊的编译器
  2. Spring AOP的底层就是通过JDK动态代理或CGLib动态代理技术为目标Bean执行横向织入
  • 1.若目标对象实现了若干接口,spring使用JDKjava.lang.reflect.Proxy类代理。
  • 2.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
  1. 程序中应优先对接口创建代理,便于程序解耦维护
  2. 标记为final的方法,不能被代理,因为无法进行覆盖
  • JDK动态代理,是针对接口生成子类,接口中方法不能使用final修饰
  • CGLib是针对目标类生产子类,因此类或方法不能使final
  1. Spring只支持方法连接点,不提供属性连接



目录
相关文章
|
27天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
15天前
|
算法 Java 数据库连接
Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性
本文详细介绍了Java连接池技术,从基础概念出发,解析了连接池的工作原理及其重要性。连接池通过复用数据库连接,显著提升了应用的性能和稳定性。文章还展示了使用HikariCP连接池的示例代码,帮助读者更好地理解和应用这一技术。
30 1
|
20天前
|
数据采集 存储 编解码
一份简明的 Base64 原理解析
Base64 编码器的原理,其实很简单,花一点点时间学会它,你就又消除了一个知识盲点。
57 3
|
2天前
|
存储 供应链 物联网
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
|
2天前
|
存储 供应链 安全
深度解析区块链技术的核心原理与应用前景
深度解析区块链技术的核心原理与应用前景
8 0
|
1月前
|
开发框架 缓存 前端开发
electron-builder 解析:你了解其背后的构建原理吗?
本文首发于微信公众号“前端徐徐”,详细解析了 electron-builder 的工作原理。electron-builder 是一个专为整合前端项目与 Electron 应用的打包工具,负责管理依赖、生成配置文件及多平台构建。文章介绍了前端项目的构建流程、配置信息收集、依赖处理、asar 打包、附加资源准备、Electron 打包、代码签名、资源压缩、卸载程序生成、安装程序生成及最终安装包输出等环节。通过剖析 electron-builder 的原理,帮助开发者更好地理解和掌握跨端桌面应用的构建流程。
72 2
|
17天前
|
供应链 安全 分布式数据库
探索区块链技术:从原理到应用的全面解析
【10月更文挑战第22天】 本文旨在深入浅出地探讨区块链技术,一种近年来引起广泛关注的分布式账本技术。我们将从区块链的基本概念入手,逐步深入到其工作原理、关键技术特点以及在金融、供应链管理等多个领域的实际应用案例。通过这篇文章,读者不仅能够理解区块链技术的核心价值和潜力,还能获得关于如何评估和选择适合自己需求的区块链解决方案的实用建议。
37 0
|
28天前
|
前端开发 JavaScript UED
axios取消请求CancelToken的原理解析及用法示例
axios取消请求CancelToken的原理解析及用法示例
81 0
|
1月前
|
存储 缓存 数据处理
深度解析:Hologres分布式存储引擎设计原理及其优化策略
【10月更文挑战第9天】在大数据时代,数据的规模和复杂性不断增加,这对数据库系统提出了更高的要求。传统的单机数据库难以应对海量数据处理的需求,而分布式数据库通过水平扩展提供了更好的解决方案。阿里云推出的Hologres是一个实时交互式分析服务,它结合了OLAP(在线分析处理)与OLTP(在线事务处理)的优势,能够在大规模数据集上提供低延迟的数据查询能力。本文将深入探讨Hologres分布式存储引擎的设计原理,并介绍一些关键的优化策略。
91 0
|
1月前
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
40 0

推荐镜像

更多