答:AOP是面向切面编程,可以通过定义方法拦截器和切入点,实现将一些逻辑相同的代码块抽取到同一个模块中,这个模块就是切面。代码可以只关注业务实现,不用关注那些通用逻辑。
答:切面,通用模块;
连接点,被拦截到的方法;
切点,对连接点的定位;
通知,想要增强的方法;
答:
- 前置通知 (@Before)
- 返回通知 (@AfterReturning)
- 异常通知 (@AfterThrowing)
- 后置通知 (@After)
- 环绕通知 (@Around)
答:在技术派实战项目中使用,我利用 AOP 打印了接口的参数日志,链路id信息,以及方法的执行时间。
- 第一步,自定义一个注解作为切点
- 第二步,配置 AOP 切面:
@Aspect
:标识切面@Pointcut
:设置切点,这里以自定义注解为切点@Around
:环绕切点,打印方法签名和执行时间
- 第三步,在使用的地方加上自定义注解
- 最后,当接口被调用时,就可以看到对应的执行日志。
答:没有用过AspectJ,只知道AspectJ 是一个易用的功能强大的 AOP 框架,属于编译时增强,性能更高,Spring AOP是运行时增强,纯Java实现。
答:Spring 的 AOP 是通过动态代理来实现的,动态代理主要有两种方式:JDK 动态代理和 CGLIB 代理。
JDK 动态代理是只能代理实现了接口的类,CGLIB 动态代理是基于继承的代理,可以代理没有实现接口的类。