55.spring的 Aop的完整实现流程?
Aop的实现大致分为三大步:javaConfig
当@EnableAspectJAutoProxy 会通过@Import注册一个BeanPostProcessor处理AOP
1.解析切面: 在Bean创建之前的第一个Bean后置处理器会去解析切面(解析切面中通知、切点,一个通知就会解析成一
个advisor(通知、切点))
2.创建动态代理 正常的Bean初始化后调用BeanPostProcessor 拿到之前缓存的advisor ,再通过advisor中pointcut
判断当前Bean是否被切点表达式匹配,如果匹配,就会为Bean创建动态代理(创建方式1.jdk动态代理2.cglib)。
3.调用:拿到动态代理对象, 调用方法 就会判断当前方法是否增强的方法, 就会通过调用链的方式依次去执行通知.
额外扩展
1、AOP相关术语
- 切面Aspect:
即添加的额外的业务逻辑
- 连接点JointPoint:
即切面可以被应用在哪些方法上,这些方法都可以统称为连接点
- 切点PointCut:
实际被切入的方法。连接点是一个逻辑上的概念,表示可以被切入的地方。切点是真实要被切入的地方。
- 通知Advice:
描述了切面是什么以及在什么位置执行。即结合了Aspect和PointCut。springAOP提供的Advice有5种,分别是前置通知,后置通知,环绕通知,异常通知,返回通知
2、AOP示例用法
原始业务逻辑SomeService
//原始业务方法逻辑
@Component
public class SomeService {
public void say(){
System.out.println("原始方法");
}
}
自定义的切面
@Component
@Aspect
public class MyAdvice {
//配置切点
@Pointcut("execution(* ldd.relearn.app.aop.SomeService.*(..))")
public void pointCut() {
}
//前置通知
@Before("pointCut()")
public void before() {
System.out.println("自定义前置通知");
}
//后置通知
@After("pointCut()")
public void after() {
System.out.println("自定义后置通知");
}
}
运行类
public class App
{
public static void main( String[] args )
{
AbstractApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
SomeService someService = (SomeService)applicationContext.getBean("someService");
someService.say();
}
}
当运行 someService.say()时,输出效果如下图所示。这就是融入了AOP的效果。