什么是AOP

  • AOP:Aspect Oriented Programing(面向切面编程)
  • 采用横向抽取机制,取代传统继承体系重复性代码(性能监视、事务管理、安全检查、缓存)即代理机制
  • 使用纯JAVA实现,不需要专门的编写过程和类加载器,在运行期通过代理方式向目标织入增强代码

AOP相关术语

  • Joinpoint(连接点):所谓连接点是指那些可以被拦截到的点。在Spring中,这些点指的是方法,因为spring只支持方法类型的连接点。
  • Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义;个人理解:一个要拦截或者已经被拦截的方法被称为一个切入点。
  • Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知。个人理解:对方法进行拦截之后所做的增强方法就是通知,分为前置通知,后置通知,异常通知,最终通知,环绕通知。
  • Introduction(引介):是一种特殊的通知在不修改类代码的前提下,Introduction可以在运行期为类动态的添加一些方法和Field。(一般一研究)
  • Target(目标对象)代理的目标对象。
  • **Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程。**spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入
  • Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
  • Aspect(切面):是切入点和通知(引介)的结合

JDK动态代理

========interface========
public interface UserDao {public void save();public void update();public void delete();public void find();
}
========UserDaoImpl========
public class UserDaoImpl implements UserDao {public void save() {System.out.println("保存用户...");}public void update() {System.out.println("修改用户...");}public void delete() {System.out.println("删除用户...");}public void find() {System.out.println("查询用户...");}
}
========MyJdkProxy========
public class MyJdkProxy implements InvocationHandler{private UserDao userDao;public MyJdkProxy(UserDao userDao){this.userDao = userDao;}public Object createProxy(){Object proxy = Proxy.newProxyInstance(userDao.getClass().getClassLoader(),userDao.getClass().getInterfaces(),this);return proxy;}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if("save".equals(method.getName())){System.out.println("权限校验...");return method.invoke(userDao,args);}return method.invoke(userDao,args);}
========Test=========
@Test
public void demo1(){UserDao userDao = new UserDaoImpl();UserDao proxy = (UserDao)new MyJdkProxy(userDao).createProxy();proxy.save();proxy.update();proxy.delete();proxy.find();
}
}

CGLIB生成代理

  • 生成了一个类,来继承这个目标类
  • 对于不使用接口的业务类,无法使用JDK动态代理
  • CGlib采用非常底层字节码技术,可以为一个类动态的增加一些方法也可以生成一个类去继承这个类,解决无接口代理问题
========ProdectDao========
public class ProdectDao {public void save(){System.out.println("保存商品....");}public void update(){System.out.println("修改商品....");}public void find(){System.out.println("删除商品....");}public void delete(){System.out.println("查询商品....");}
}
========MyCglibPorxy========
public class MyCglibPorxy implements MethodInterceptor {private ProdectDao prodectDao;public MyCglibPorxy(ProdectDao prodectDao){this.prodectDao=prodectDao;}public Object createProxy(){//1.创建核心类Enhancer enhancer = new Enhancer();//2.设置父类enhancer.setSuperclass(prodectDao.getClass());//3.设置回调enhancer.setCallback(this);//4.生成代理Object proxy = enhancer.create();return proxy;}@Overridepublic Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {if ("save".equals(method.getName())){System.out.println("权限校验....");return methodProxy.invokeSuper(proxy,args);}return methodProxy.invokeSuper(proxy,args);}
}
========Test========
@Test
public void demo1(){ProdectDao prodectDao = new ProdectDao();ProdectDao porxy = (ProdectDao) new MyCglibPorxy(prodectDao).createProxy();porxy.save();porxy.find();porxy.update();porxy.delete();
}

总结

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

Spring AOP底层原理相关推荐

  1. Spring AOP 底层原理_001----AspectJ与CGLIB介绍

    http://www.ibm.com/developerworks/cn/java/l-aspectJ/index.html中介绍了What is AspectJ . AspectJ是一个代码生成工具 ...

  2. Spring AOP底层实现原理(动态代理)

    什么是AOP? AOP(面向切面编程)通过预编译的方式 和 运行期动态代理的方式来实现程序功能统一维护的一种方式,是OOP(面向对象编程)的延续.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业 ...

  3. [Spring5]AOP底层原理

    AOP底层原理 1.AOP底层使用动态代理 (1)有两种情况动态代理 第一种 有接口的情况,使用JDK动态代理 a.创建接口实现类代理对象,增强类的方法 第二种 没有接口的情况,使用CGLIB动态代理 ...

  4. AOP底层原理与注解配置详解

    注解开发AOP制作步骤: 在XML格式基础上 导入坐标(伴随spring-context坐标导入已经依赖导入完成 开启AOP注解支持 配置切面@Aspect 定义专用的切入点方法,并配置切入点@Poi ...

  5. 【JAVA SE】第十七章 反射、注解与Spring事务底层原理

    第十七章 反射.注解与Spring事务底层原理 文章目录 第十七章 反射.注解与Spring事务底层原理 一.反射 1.简介 2.意义 3.缺点 4.应用场景 5.反射技术的使用 二.注解 1.概念 ...

  6. spring注解驱动开发-6 Spring AOP实现原理

    Spring AOP实现原理 前言 1.@EnableAspectJAutoProxy注解原理 2.AnnotationAwareAspectJAutoProxyCreator 分析 1.分析前工作, ...

  7. 灵魂画手图解Spring AOP实现原理!

    本篇旨在让读者对Spring AOP实现原理有一个宏观上的认识,因此会丢失一些细节,具体实现参考:老实人Spring源码目录 阅读本篇文章前,希望读者对Spring Ioc以及Spring AOP的使 ...

  8. Spring AOP实现原理,从代理说起

    前言 为了理解Spring AOP,我们先来了解一下Java的代理模式 什么是代理? 举个例子来说明代理的作用: 假设我们想邀请一位明星,那么并不是直接联系明星,而是联系明星的经纪人,来达到同样的目的 ...

  9. Spring Cloud底层原理(转载 石杉的架构笔记)

    拜托!面试请不要再问我Spring Cloud底层原理 原创: 中华石杉 石杉的架构笔记 目录 一.业务场景介绍 二.Spring Cloud核心组件:Eureka 三.Spring Cloud核心组 ...

最新文章

  1. C++中explicit关键字的作用
  2. layUI框架中文件上传前后端交互及遇到的相关问题
  3. 使用Java 8.0进行类型安全的依赖项注入
  4. 【CodeForces - 1066A~E】水题,模拟(有技巧),思维,题意难懂的模拟,二进制问题(有技巧)
  5. Angularjs 动态添加指令并绑定事件
  6. FreeEIM 2.0 beta 发布
  7. 【中文分词】隐马尔可夫模型HMM
  8. 柱形图无数据可选中_Excel---多层柱形图来了!让领导看呆
  9. 恢复 混淆后的 stacktrace 文件
  10. 机器学习和AI的区别是什么?| 今日吐槽
  11. android fastboot原理,FastBoot使用一
  12. 【洛谷试炼场】普及练习场——排序
  13. 手机java淘汰_极客修:对手并不止安卓!这些年iOS竟然把这么多手机系统淘汰掉了...
  14. 欧洲游记之—— 路过荷兰
  15. 高德地图插件使用汇总(干货-从注册到熟练使用)
  16. 【JavaWeb】之Tomcat介绍、安装与使用
  17. 汇编 输入成绩,排序输出,平均值,及格,不及格人数,最大最小值
  18. Docker-CE 监控
  19. 【更新!】3dMax材质ID随机生成器插件MaterialIDsRandomGenerator v2.1.2使用教程
  20. 力扣45跳跃游戏II(难)JAVA

热门文章

  1. 【Java框架型项目从入门到装逼】第四节 - 编写第一个Servlet程序
  2. php多表头表格,HTML多表头表格代码_HTML/Xhtml_网页制作
  3. 计算机二级综合应用代码题多少分,计算机二级题型及分值分布
  4. 独木桥问题-PV操作解决同步问题
  5. 2018年6月夏皇梅开品
  6. 它便是那只大闹天宫的泼猴,今生注定不凡
  7. (一)Orangepi Zero2 的刷机和登录
  8. 阿里巴巴编程工作导师待遇_导师制iOS应用中的泛型编程之旅
  9. 云开发还可以这么玩!从红包外卖优惠券薅羊毛说起...
  10. codeforces144——D. Missile Silos(最短路+枚举)