从三个方面理解Spring框架之AOP 面向切面编程

本文摘要:从是什么,为什么,怎么做三个方面讲讲我对springAOP的理解。

一:是什么:什么是AOP?
AOP(Aspect Oriented Programming),面向切面编程,是Spring框架的核心组件之一。
提到AOP,不得不提一下Java中的OOP(bject-Oriented Programming)面向对象编程,其模块单元是类。,类封装了一类对象的行为和状态,当多个类有共同的属性和行为时候我们可以把这些共同的东西封装为一个基类,然后多个类可以通过继承基类的方式来复用这些共同的东西,如果子类需要定制基类行为则可以使用多态。OOP 中使用类来提供封装,继承,多态三个特性。
AOP采取横向抽取机制,取代了传统纵向继承体系的重复性代码。横向并排
纵向排列
而AOP正是将那些拥有相同功能的类归类到一起形成一个切面,这个切面上所有的类都在某个功能上相同,即这个切面将很多类的相同功能“抽”出来了。
而在 AOP 中模块化单元是切面(Aspect),它将那些影响多个类的共同行为封装到可重用的模块中,然后你就可以决定在什么时候对哪些类的哪些行为执行进行拦截(切点),并使用封装好的可重用模块里面的行为(通知)对其拦截的业务行为进行功能增强,而不需要修改业务模块的代码,切面就是对此的一个抽象描述。

二:为什么:为什么需要AOP?
或者说AOP可以运用在什么场景或解决哪些不足之处。
举两个例子。
一,比如说我们又很多类,每个类都需要计算这个类被调用的时间,这个耗时业务,如果按照OOP面向对象编程的话,需要在每个类里面加入计算时间的代码,这样做结果就是业务逻辑行为受到了计算耗时代码干扰(业务逻辑行为应该只专注业务),二是计算耗时的代码不能被复用。AOP便可以解决这些问题。
二,在一个业务系统中,用户登录是基础功能,凡是涉及到用户的业务流程都要求用户进行系统登录。如果把用户登录功能代码写入到每个业务流程中,会造成代码冗余,维护也非常麻烦,当需要修改用户登录功能时,就需要修改每个业务流程的用户登录代码,这种处理方式显然是不可取的。比较好的做法是把用户登录功能抽取出来,形成独立的模块,当业务流程需要用户登录时,系统自动把登录功能切入到业务流程中。
使用AOP有诸多好处,如:
1.集中处理某一关注点/横切逻辑
2.可以很方便的添加/删除关注点
3.侵入性少,增强代码可读性及可维护性
4.可以“偷懒”,将一些如安全,事务,日志等东西交给程序自动生成,而让程序员专注于业务逻辑,减少程序员的工作。
三:AOP的术语名词
1.连接点(Joinpoint)
连接点就是程序执行的某个特定的位置,如:类开始初始化前、类初始化后、类的某个方法调用前、类的某个方法调用后、方法抛出异常后等。
Spring 只支持类的方法前、后、抛出异常后的连接点。
2.切点(Pointcut)
一个项目中有很多的类,一个类有很多个连接点,当我们需要在某个方法前插入一段增强(advice)代码时,我们就需要使用切点信息来确定,要在哪些连接点上添加增强。
那么切点是什么?
如果把连接点当做数据库中的记录,那么切点就是查找该记录的查询条件。
所以,一般我们要实现一个切点时,那么我们需要判断哪些连接点是符合我们的条件的,如:方法名是否匹配、类是否是某个类、以及子类等。
3.通知/增强(Advice)
就是程序员想要的东西,如安全,日志等,我们只需要定义的东西
4.切面(Aspect)
是通知和切点的结合。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
5.引入(introduction)
就是把切面(也就是新方法属性:通知定义的)用到目标类中。
是一种特殊的增强,为类增加一些属性和方法。有了引入,这样一个类即使没有实现接口,通过AOP的引入功能,可以动态的为该类添加接口的实现逻辑,从而让该类成为接口类的实现类。
6.目标(Target)
目标对象就是我们需要对它进行通知的业务类.
7.织入(Weaving)
织入就是将通知添加到目标类具体连接点上的过程。分为三种:
编译期织入,这要求使用特殊java编译器
类装载期织入,这要求使用特殊的类装载器
动态代理织入,在运行期为目标类添加通知生成子类的方式(Spring采用这种方法)
8.代理(Proxy)
一个类被AOP织入后生成出了一个结果类,它就是融合了原类和通知逻辑的代理类。

四:怎么做:如何实现AOP?
1.经典的基于代理的AOP
2.@AspectJ注解驱动的切面
3.纯POJO切面(纯粹通过aop:fonfig标签配置)
4.注入式AspectJ切面
由于要是展开讲的话会有很多内容,所以接下来大致讲解这四种方法,以后再慢慢剖析。
经典的基于代理(Proxy)的AOP:分为静态代理和动态代理,动态代理又分为JDK动态代理和cglib动态代理。在Spring框架中AOP动态代理机制,如果被代理对象实现了需要被代理的接口,则使用JDK的动态代理,如果没有实现接口则使用CGLIB动态代理。
@AspectJ注解驱动的切面:
AspectJ的通知类型
@Before 前置通知,相当于BeforeAdvice
@AfterReturning 后置通知,相当于AfterReturningAdvice
@Around 环绕通知,相当于MethodInterceptor
@AfterThrowing抛出通知,相当于ThrowAdvice
@After 最终final通知,不管是否异常,该通知都会执行
POJO切面(纯粹通过aop:fonfig标签配置):优点就是在代码中不体现任何AOP相关配置,纯粹使用xml配置

本文也参照了以下几位大佬的博客:
https://www.cnblogs.com/xiaolovewei/p/8999512.html
https://blog.csdn.net/qq_21050291/article/details/72529275
https://blog.csdn.net/qukaiwei/article/details/50367761

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值