理解Spring AOP
提到AOP那我们自然会想到初学java时经常提到的OOP,OOP表示的是面向对象编程,是一种编程思想。AOP则是面向切面编程,同样也是一种编程思想。从Spring作为一个框架的角度来说,提供了一整套的面向切面编程的机制,让我们更容易进行开发,这套机制在Spring中就称为Spring AOP。
知道了AOP是一种编程思想,那又是一种什么样的编程思想呢?
AOP:将程序中的交叉业务(日志、安全、事务等),封装成一个切面,然后注入到目标对象的具体逻辑中去。AOP可以对某个对象或某些对象的功能进行增强,具体来说,对某个对象的方法进行增强,可以在执行方法之余额外做一些事情,可以在方法前、方法后等。
Spring AOP中的概念
- Aspect:切面,比如被@Aspect注解的类就是切面,可以在切面中去定义Pointcut、advice等等
- Join point:连接点,表示一个程序在执行过程中的一个点,比如一个方法的运行,比如一个异常的处理。在Spring AOP中,一个连接点通常表示一个方法的执行。
- Advice:通知,表示在一个特定连接点上所采取的动作。
- Pointcut:切点,用来匹配一个或多个连接点,Advice与切点表达式时关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上
- Introduction:可以使用@DeclareParents来给所匹配的类添加一个接口,并指定一个默认实现
- Target object:目标对象,被代理对象
- AOP proxy:代理工厂,用来创建代理对象的。在Spring Framework中,要么是JDK动态代理,要么是CGLIB代理
- Weaving:织入,表示创建代理对象的动作,这个动作Aspejctij发生在编译时期,Spring AOP在运行时
实现方式(动态代理)
站内文章:
web访问:java设计模式之动态代理实现与原理详细分析
文章中介绍了什么是代理模式、常见的代理模式的类型、动态代理的原理、以及在Spring AOP中的应用
我们先回顾下上述文章中说到的Spring AOP在源码中的体现
源码解析
Spring AOP 解析切面源码入口 @EnableAspectJAutoProxy
—> AspectJAutoProxyRegistrar
—>AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
通过上面的注册一个Bean定义 AnnotationAwareAspectJAutoProxyCreator.class
查看注册的bean的结构,可以知道注册的是一个bean的后置处理器;此处就是ioc的一个扩展点。
接下来我们重点看几个重要的类
ProxyFactory
这个就是应用代理技术,Spring经过封装后,生成的代理工厂类,会由它来负责创建具体的代理类。
通过ProxyFactory
,我们在使用过程中不需要去关注到底使用cglib,还是jdk动态代理,Spring实现的PorxyFactory会帮助我们去判断通过何种方式生成代理类
- 如果被代理类实现了接口,那么底层就会自动使用jdk动态代理,生成对应接口类型的代理对象
- 如果被代理类没有实现接口,那么就选择cglib技术
Advice
五个注解,表示代理逻辑以及执行时机
- @Before:接口MethodBeforeAdvice,继承了接口BeforeAdvice
- @AfterReturning:接口AfterReturningAdvice
- @AfterThrowing:接口ThrowsAdvice
- @After:接口AfterAdvice
- @Around:接口AfterAdvice
Spring会把五个注解解析为对应的Advice类:
- @Before:AspectJMethodBeforeAdvice,实际上就是一个MethodBeforeAdvice
- @AfterReturning:AspectJAfterReturningAdvice,实际上就是一个AfterReturningAdvice
- @AfterThrowing:AspectJAfterThrowingAdvice,实际上就是一个MethodInterceptor
- @After:AspectJAfterAdvice,实际上就是一个MethodInterceptor
- @Around:AspectJAroundAdvice,实际上就是一个MethodInterceptor
...
...
Copyright 2021 sunfy.top ALL Rights Reserved