写点什么

Spring AOP

作者:武师叔
  • 2022 年 7 月 11 日
  • 本文字数:861 字

    阅读完需:约 3 分钟

Spring AOP

Spring AOP



AOP 原理

面向切面

( Aspect Orient Programming ) 面向切面编程,是面向对象编程(OOP) 的一种补充。


在 Java 程序自上而下处理主业务时,也会经常处理一些和主业务逻辑无关的问题(比如在接收用户访问请求时,计算程序响应该请求的运行时间)。这些代码如果和主逻辑代码混淆,会导致后期难以维护。


AOP 就是将这些横切性问题和主逻辑解耦。保证开发者不修改主逻辑代码的前提下,能为系统中的业务组件添加删除、或复用某种功能。

代理模式

AOP 的本质是修改业务组件实际执行方法的源代码。即代理类 A 封装了目标类 B ,外部调用 B 的目标方法时会被代理类 A 拦截,代理类 A 一方面执行切面逻辑,一方面把调用转发给目标类 B ,执行目标方法。


该过程是代理模式的实现,代理方式有以下两种:


  • 静态 AOP :在编译阶段对程序源代码进行修改,生成静态的 AOP 代理类(字节码文件已被修改)。性能更好。

  • 动态 AOP :在运行阶段动态生成代理对象。灵活性更好。

动态代理

Spring 中的 AOP 是通过动态代理实现的,有以下两种方式:


  • JDK 动态代理


利用反射机制生成一个实现代理接口的类,在调用具体方法前调用 InvokeHandler 来处理。


JDK 代理只能对实现接口的类生成代理。代理生成的是一个接口对象,因此代理类必须实现了接口,否则会抛出异常。


  • CGlib 动态代理


直接操作字节码对代理对象类的字节码文件加载并修改,生成子类来处理。


CGlib 代理针对类实现代理,对指定的类生成一个子类并覆盖其中的方法,因此不能代理 final 类。



AOP 注解详解

配置

对负责扫描组件的配置文件类(@Configuration) 添加 @EnableAspectJAutoProxy 注解,启用 AOP 功能。


**默认通过 JDK 动态代理方式进行织入。**但必须代理一个实现接口的类,否则会抛出异常。


注解改为 @EnableAspectJAutoProxy(proxyTargetClass = true)


通过 cglib 的动态代理方式进行织入。但如果拓展类的方法被 final 修饰,则织入无效。


@Configuration@ComponentScan(basePackageClasses = {com.company.project.service.Meal.class})@EnableAspectJAutoProxy(proxyTargetClass = true)public class AppConfig {}
复制代码


发布于: 刚刚阅读数: 3
用户头像

武师叔

关注

每天丰富自己,去过自己想要的生活! 2022.04.28 加入

一个喜欢最新技术,研发的人工智能专业的大二学生,用自己的代码做一些有意义的事情! 目前大二结束有去大厂研发岗实习的计划,每天丰富自己的技术,去过自己想要的实习生活。

评论

发布
暂无评论
Spring AOP_7月月更_武师叔_InfoQ写作社区