spring学习(4)
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 {
}
- 点赞
- 收藏
- 关注作者
评论(0)