Spring AOP源码解读

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取10G资料包与项目实战视频资料

Spring AOP源码解读

advice**通知**

定义在连接点做点什么,为切面增强提供织入接口,在Spring AOP中,主要描述围绕方法调用而注入的切面行为。

Pointcut切点

Pointcut(切点)决定Advice通知应该作用于哪个连接点,也就是通过Pointcut来定义需要增强的方法的集合。Pointcut通常意味着标识方法

20191123100301\_1.png

在接口PointCut中定义了MethodMatcher getMethodMatcher()方法,由这个方法来判断是否需要对当前方法调用进行增强,或者是否需要对当前调用方法应用配置

好的Advice通知。

在如上图的继承关系中,JdkRegexpMethodPointcut类完成通过正则表达式对方法名进行匹配的功能。

Advisor通知器

完成目标方法的切面增强设计(advice)和关注点的设计(Pointcut·)以后,需要一个对象把它们结合起来,完成这个作用的就是Advisor(通知器)。

可以看看一个实现了advisor的类

20191123100301\_2.png

在DefaultPointcutAdvisor中有两个属性 advice和Pointcut。

Spring AOP的设计和实现

在Spring AOP实现中,使用的核心技术就是动态代理。

在Spring的AOP模块中,一个主要的部分是代理对象的生成,而对Spring应用,可以看到,是通过配置和调用ProxyFactoryBean来完成这个任务,在ProxyFactoryBean中

封装了主要代理对象的生成过程

<!–EndFragment–>

20191123100301\_3.png

ProxyFactoryBean 在继承体系上和ProxyFactory并没有太多差异,但是ProxyFactoryBean实现了 BeanFactoryAware, BeanClassLoaderAware, FactoryBean 三个接口,

那么ProxyFactoryBean 和IOC容器有了交融的地方了,ProxyFactoryBean 正是借助IOC容器的配置,找到Advice增强和target对象

ProxyFactory**Bean类**

在了解ProxyFactoryBean的实现之前,先简单介绍一下使用和配置

<!–EndFragment–>

先穿插一下动态代理的实现

20191123100301\_4.png

20191123100301\_5.png

20191123100301\_6.png

20191123100301\_7.png

运行结果为

<!–EndFragment–>
20191123100301\_8.png

使用AOP的继承类来实现拦截

增加一个实现前置通知
20191123100301\_9.png

20191123100301\_10.png

使用XML配置的形式如下:

<!–EndFragment–>
20191123100301\_11.png

使用拦截 1> 定义通知器Advisor,这通知器的实现定义了需要对目标对象进行增强的切面行为,也就是Advice通知。

2>定义ProxyFactoryBean,用来封装AOP功能的主要类,在配置这个类的时候,需要设定与AOP实现相关的属性例如 proxyInterface

interceptorNames和target.

ProxyFactoryBean的AOP实现需要依赖JDK或者CGLIB提供的Proxy特性。从FactoryBean中获取对象,是以getObject()方法作为入口完成。

对于ProxyFactoryBean需要把对target目标对象增加的增强处理,都是通过getObject方法进行封装,这些增强处理是AOP功能的实现提供服务。

20191123100301\_12.png

这些拦截器都是从配置文件中读取,然后为代理对象的生成做好准备。由于代理对象有singleton类型和prototype类型

20191123100301\_13.png

20191123100301\_14.png

初始化连接器,形成拦截器链。对于Singleton的代理对象在getSingletonInstance()代码中完成,这个方法是ProxyFactoryBean生成AOPProxy代理对象的调用入口

<!–EndFragment–>

20191123100301\_15.png

20191123100301\_16.png

具体的代理对象的生成,是在ProxyFactoryBean的基类AdvisedSupport的实现中借助AopProxyFactory来完成的

ProxyCreatorSupport类中生成AOPProxy对象

<!–EndFragment–>

20191123100301\_17.png

AopProxyFactory使用的是
20191123100301\_18.png

另外对代理对象的生成,需要考虑用哪种生成方式,如果目标对象是接口类,那么用JDK来生成代理对象,否则采用CGLIB来生成目标对象的代理对象。
20191123100301\_19.png

在AopProxy代理对象的生成过程中,首先要从AdvisedSupport对象中取得配置的目标对象,对目标对象进行检测

需要根据配置的情况来决定使用什么方式来创建AopProxy代理对象。

主要介绍一下JDK生成AOPProxy代理对象的方式

在JdkDynamicAopProxy中,使用了Proxy类来生成代理对象。

<!–EndFragment–><!–EndFragment–>

20191123100301\_20.png

连接器链(通知切入集合),代理对象的生成的流程如下:

20191123100301\_21.png
Spring AOP连接器调用链的实现

在JdkDynamicAopProxy实现了InvocationHandler接口,对Proxy对象的代理设置是在invoke方法中实现的,如下:

20191123100301\_22.png

20191123100301\_23.png

20191123100301\_24.png

如上代码所示,如果没设置拦截器,那么会对目标对象的方法直接进行调用。对于JdkDynamicAopProxy代理对象,这个对目标对象的方法调用是通过AopUtils使用反射机制

在invokeJoinpointUsingReflection方法

<!–EndFragment–>
20191123100301\_25.png

对拦截器的的目标对象的增强,是调用ReflectiveMethodInvocation类的

<!–EndFragment–>
20191123100301\_26.png

其中生成连接器链从类 DefaultAdvisorChainFactory的

<!–EndFragment–>
20191123100301\_27.png

整个的AOP拦截调用如下图:

<!–EndFragment–>
20191123100301\_28.png

<!–EndFragment–>


来源:http://ddrv.cn/a/88268

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring AOP源码解读

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏