SpringAOP的应用场景都有:
- 日志记录
- 异常处理
- 权限验证
- 缓存处理
- 事务处理
- 数据持久化
- 效率检查
- 内容分发
Spring AOP中关键字解释
- aspect:切面,切面有切点和通知组成,即包括横切逻辑的定义也包括连接点的定义。
- pointcut:切点,每个类都拥有多个连接点,可以理解是连接点的集合。
- joinpoint:连接点,程序执行的某个特定的为知,如某个方法调用前后。
- weaving:织入,将增强添加到目标类的具体连接点的过程。
- advice:通知,是织入到目标类连接点上的一段代码,就是增强到什么地方?增强什么内容?
- target:目标对象。通知织如的目标类。
- aop Proxy:代理对象。即增强后产生的对象。
Spring AOP底层实现,是通过JDK动态代理或者CGlib代理在运行时期在对象初始化阶段织入代码的。
JDK代理和CGlib代理的区别?
- JDK代理是基于接口实现;
- CGlib代理是基于类的继承实现;
通知(Advice)的种类
-
Before advice 前置通知,即在目标方法调用之前执行。注意:即无论方法是否遇到异常都执行。
-
After returning advice 后置通知,在目标方法执行后执行,前提是目标方法没有遇到异常,如果有异常则不执行通知。
-
After throwing advice 异常通知,在目标放大抛出异常时执行,可以获取异常信息。
-
Afte finally advice 最终通知,在目标方法执行后执行,无论是否是异常执行。
-
Around advice 环绕通知,最强大的通知类型,可以控制目标放大的执行,(通过调用 ProceedingJoinPoint.proceed( ) ),可以再目标执行全过程中进行执行。
Aspect切面实现步骤
-
定义一个切面类Aspect 即在声明的类,增加@Component @Aspect 两个注释,SpringBoot中要引入spring-boot-starter-aop依赖包。
-
定义切点Poincut 定义切点,并定义切点在那些地方执行,采用@Poincut注解完成,如
@Poincut(execution((public * com.macro.mall.controller.*.*(..))) )规则:修饰符(public 可以不写,但不能用 * ) + 返回类型 + 那些包下的类 + 那些方法 + 方法参数 " * "代表不限 ," .. "两个点代表参数不限。 -
定义Adevice通知 利用通知的物种类型注解 @Before、@After、@AfterReturning、@AfterThrowing、@Around来完成在某些切点的增强动作,如: @Before("myPoincut()"),myPoincut为第二步骤定义的切点。