博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring架构揭秘-AOP
阅读量:6572 次
发布时间:2019-06-24

本文共 1832 字,大约阅读时间需要 6 分钟。

hot3.png

1、AOP概述

2、Spring AOP原理

3、Spring AOP架构解析

 

一、AOP概述

     Java程序员在写代码的时候通常都是使用新建对象类来描述业务特性,然后通过对象的继承、组合、扩展等手段来实现业务需求,这是典型的面相对象的编程方式即OOP,总的来说OOP是一种由上至下的竖向编程模式。

     在实际的编程中,通常会遇到某些方法里会使用到相同的逻辑,比如记方法执行日志,这些代码在OOP中没法与业务代码完全的解藕,使得方法代码就有了混合逻辑,不符合编程的单一责任原则。如果可以把这块逻辑代码解藕,通把两种逻辑的代码区分开,然后在运行期再合起来就完美了,就相当于在运行期横向的添砖加瓦,也就是面向切面横向的编程即AOP。

二、Spring AOP原理

     实现AOP的主要技术就是动态代理 ,动态代理的原理这里就不细说了,主要是来看看Spring AOP的实现原理 。我们知道通常使用的动态代理技术有JDK的和CGLIB的,其中JDK的动态代理只能代理接口级别,而CGLIB则还可以代理类级别,在Spring中结合了这两者,使得其更灵活。

     在细说Spring AOP原理之前先来看看以下几个重要的概念:

          a、连接点(JoinPoint):程序执行的莫个特定位置,比如类初始化之前,类初始化之后,方法执行之前,方法执行之后,异常抛出之后等等。

          b、切点(PointCut):指定程序执行的位置,每个类对象都有多个JoinPoint,那么到底要在哪个JoinPoint上执行呢?这就需要用PointCut来指定,通常一个PointCut可以对应多个JoinPoint。

          c、增强(Advice):增强就是织入到目标类连接点上的一段程序代码,不少地方叫它通知,笔者觉得叫增强更能表达其含义。Spring 中有BeforeAdvice,AfterAdvice等。其中AOP联盟定义了标准接口Advice,Spring AOP也是基于它进行扩展的。

          d、切面(Aspect):切面是切点和增强的组合,Spring AOP就是切面的实施框架,将切面中定义的增强逻辑实施到切面中指定的连结点中去。

          e、代理(Proxy):一个类被织入增强的代码后就会产生一个代理类,在运行期真正被执行的对象。

 

     下面用图来说一下Spring AOP的原理。

Spring在初始化容器的时候会扫描相关的配置,包括XML、Annotation等,发现有标注了Aspect的Bean后会根据切面中切点定义找到目标类,并且为其织入增强代码并且通过代理生成器生成代理对象,然后供用户使用。

 

三、Spring AOP架构解析

     下面用图来阐述Spring AOP的主要组成部分以及其组件结构,先来看看Spring AOP的组件图

Spring的AOP主要由四大组件构成,分别是切点组件、切面组件、增强组件、代理组件。

根据这四大组件,来看看具体的类图。

 

切点组件类图:

PointCut接口只定义了两个方法,一个是getClassFilter()用于获取过滤器,判别切点能否用于目标类上,另一个则是getMethodMatcher()用于获取方法匹配器,spring提供静态和动态的方法匹配器 ,除此外还有别的方法匹配器,这里就不列举了,静态方法匹配器仅根据方法签名进行匹配,不关心运行时的参数,只匹配一次,而动态方法匹配器则因为每次方法执行传入的参数可能不一样,所以每次调用方法都需要判断,对性能影响较大。

 

增强组件类图:

AOP联盟定义了AOP的标准,其中一个就是Advice增强接口,各大AOP框架都基于它来进行扩展,其中Spring就在它的基础上扩展了AfterAdvice,BeforeAdvice,DynamicIntroductionAdvice,Inteceptor也是AOP联盟定义的一个接口,用于环绕增强,即在方法执行的前后都织入增强逻辑

 

代理组件类图

在Spring里,当容器初始化时扫描到切面类就会通过ProxyFactory的getProxy()来获取代理对象,然后加入Bean存储器供使用。从上图中可以清晰的看出Spring支持JDK和Cglib两种动态代理方式。

 

切面组件类图

AOP总架构类图

通过最后的总架构类图就很清楚的知道Spring AOP框架的结构以及其个组件之间的组合关系

转载于:https://my.oschina.net/sgkbkega/blog/744059

你可能感兴趣的文章
Android Studio 插件开发详解一:入门练手
查看>>
windows下bat批处理实现守护进程
查看>>
Jenkins+Gitlab+ansible-playbook上线流程
查看>>
回车提交、连续点击、layer提示
查看>>
kafka学习笔记
查看>>
微信小程序实质是什么? Hybrid App
查看>>
[禅悟人生]鹰和蜗牛都能登上金字塔尖
查看>>
Apache与Tomcat有什么关系和区别
查看>>
Swift语言精要 - Dictionary(字典)
查看>>
<转>好婚姻是彼此放心
查看>>
4.18. 创建与修改时间
查看>>
SAP MM GR/IR Account Maintenance的DEMO
查看>>
C#根据日期DateTime和持续时间int找到日期
查看>>
高性能日记--show profile剖析sql语句
查看>>
蹭着 Java 热点出生的 JavaScript 已经 22 岁了!
查看>>
mysqldump简单解析
查看>>
Master主动向Slave发送binlog?还是Slave主动向Master要binlog?
查看>>
WordPress纯PHP代码实现记录搜索引擎蜘蛛爬行记录
查看>>
CentOS6.5和RedHat6.5下以rpm方式安装mysql-5.6.20
查看>>
【Win 10应用开发】Adaptive磁贴模板的XML文档结构
查看>>