Aop的基本概念
Aop面向切面编程,在方法之前和之后实现处理 应用场景在于:日志打印、事务实现、安全等。
下面展示五个通知的例子
。
注意:ProceedingJoinPoint只能在环绕通知中拿到,其他的通知拿不到的,其他通知拿的是JoinPoint
package com.mayikt.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;
/**
* @Description:
* @Author: ChenYi
* @Date: 2020/07/05 08:11
**/
@Aspect
@Component
@EnableAspectJAutoProxy
public class MyAspect {
@Pointcut("execution (* com.mayikt.service..*.*(..))")
public void pointCut() {
}
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
System.out.println("前置通知执行>>>>");
}
@After("pointCut()")
public void after() {
System.out.println("后置通知执行>>>>");
}
@AfterReturning("pointCut()")
public void afterReturning() {
System.out.println("运行通知执行>>>>");
}
@AfterThrowing("pointCut()")
public void afterThrowing(JoinPoint joinPoint) {
System.out.println("异常通知执行>>>>");
}
@Around("pointCut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知之前执行>>>>");
joinPoint.proceed();
System.out.println("环绕通知之后执行>>>>>");
return null;
}
}
源码流程
- @EnableAspectJAutoProxy开始Aop的权限
- @Import(AspectJAutoProxyRegistrar.class)
- AspectJAutoProxyRegistrar手动注册,切面类
- 将该类AnnotationAwareAspectJAutoProxyCreator注册到ioc容器中,beanId为org.springframework.aop.config.internalAutoProxyCreator,该类是BeanPostProcessor的子类
- BeanPostProcessors是对我们bean的初始化方法实现增强,init方法之前和之后处理
AnnotationAwareAspectJAutoProxyCreator
前置:没有处理任何的事情
后置:postProcessAfterInitialization使用后置处理器实现代理对象创建,因为需要等对象都初始化完成了再创建代理类对象,所以代理的操作时放在后置中的,创建代理对象,如果被代理的这个类如果实现了接口的话,就使用JDK动态代理,如果没有实现接口则使用cglib
AbstractAutoProxyCreator这个类中
参考:蚂蚁课堂