Spring复习:AOP(一)概念

Spring复习:AOP(一)概念

简介

AOP(Aspect Orient Programming),面向切面编程。

面向切面编程,就是将交叉业务逻辑封装成切面,利用 AOP 容器的功能将切面织入到主业务逻辑中。

所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、
事务、日志、缓存等。

若不使用 AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,
会使主业务逻辑变的混杂不清。

例如,转账,在真正转账业务逻辑前后,需要权限控制、日志记录、加载事务、结束事务等交叉业务逻辑,而这些业务逻辑与主业务逻辑间并无直接关系。但,它们的代码量所占比重能达到总代码量的一半甚至还多。它们的存在,不仅产生了大量的“冗余”代码,还大大干扰了主业务逻辑—转账。

AOP底层,是采用 动态代理 模式实现的。

采用了两种代理:JDK 的动态代理,与 CGLIB
的动态代理

AOP有什么作用

1.在模板类源代码不改变的情况下,增加功能
2.减少代码的重复
3.专注业务逻辑代码
4.解耦合,让业务功能和非业务功能分离。

AOP术语

Aspect(切面)

切面泛指交叉业务逻辑。上例中的事务处理、日志处理就可以理解为切面。常用的切面是通知(Advice)。实际就是对主业务逻辑的一种增强。

JoinPoint(连接点)

连接点指可以被切面织入的具体方法。
通常指的是主要业务逻辑方法。
上面例子中的主业务逻辑就是转账操作。

Pointcut(切入点)

切入点指多个连接点方法的集合。
连接点是一个方法,而切入点是多个方法,这些方法,都需要被切面增强。

Target(目标对象)

目标对象指将要被增强的对象 即包含主业务逻辑的类的对象。

Advice(通知)

通知,表示切面功能执行的时机。
通知定义了增强代码切入到目标代码的时间点,是目标方法执行之前执行,还是之后执行等等。
通知类型不同,切入时机不同。
切入点定义了切入的位置,通知定义切入的时机。

切面三要素

1、切面的功能代码,要进行怎样的增强。
2、切面的执行位置,要增强的目标。
3、切面的执行时机,是在目标方法之前、之后,还是方法抛出异常时等等。

AOP的实现

AOP是一个规范,是动态代理的一个规范化,一个标准。
AOP的技术实现框架:
1.Spring在内容实现了AOP规范,能做AOP的工作。Spring主要在处理事务和日志时使用AOP。但是因为使用起来比较麻烦,在开发中很少使用Spring的AOP。
2.AspectJ是一个开源的专门做AOP的框架。实现方式更为便捷,使用更加方便,而且还支持注解式开发。所以spring框架也中集成了AspectJ,通过Spring就能使用。
AspectJ框架实现AOP有两种方式:
    1)使用xml配置文件。
    2)使用注解

AspectJ框架的使用

通知类型

通知定义切入的时机。

AspectJ中常用的通知有五个:
(1)前置通知 | @Before
(2)后置通知 | @AfterReturning
(3)环绕通知 | @Around
(4)异常通知 | @AfterThrowing
(5)最终通知 | @After

切入点表达式

切入点指多个连接点方法的集合。

AspectJ 定义了专门的表达式用于指定切入点,用来表示哪些方法要作为连接点

表达式的原型是:

execution(modifiers-pattern? ret-type-pattern 
declaring-type-pattern?name-pattern(param-pattern)
 throws-pattern?)
名称解释可选类型
modifiers-pattern方法的访问权限类型可选
ret-type-pattern方法的返回值类型**必需**
declaring-type-pattern方法的全类名(包名.类型)可选
name-pattern(param-pattern)方法名(参数类型和参数个数)**必需**
throws-pattern抛出的异常类型可选
excution(访问修饰符 返回值 全类名.方法名(参数) 异常)

通配符

符号意义
*(星号)0或多个任意字符
..(两个点) 用在方法参数中,表示任意多个参数
用在包名后,表示当前包及其子包路径
+(加号) 用在类名后,表示当前类及其子类
用在接口后,表示当前接口及其实现类
举例:
    
    任意公共方法
    execution(public * *(..))

    任何一个以“set”开始的方法
    execution(* set*(..))

    任意返回值,在com.xyz.service包中的类(接口)的任意方法
    execution(* com.xyz.service.*.*(..))

    所有包下的 serivce 子包下所有类(接口)中所有方法
    execution(* *..service.*.*(..))

    在 service 包或者子包里的任意类的任意方法
    execution(* com.xyz.service..*.*(..))

使用AspectJ实现AOP的基本步骤

基本步骤

1.新建maven项目
2.加入依赖
    1)spring依赖
    2)AspectJ依赖
3.创建目标类:接口和它的实现类
4.创建切面类
    1)在类的上面加入@Aspect
    2)在类中定义方法,方法就是切面要执行的功能代码
    3)在方法上加入Advice注解
    4)切入点表达式
5.创建Spring的配置文件,声明对象,把对象交给容器同一管理
    可以使用注解或者<bean>标签
    1)目标对象
    2)切面类对象
    3)声明AspectJ框架中的自动代理生成器标签
        用来完成蒂埃里对象的自动生成
6.创建测试类,从spring容器中获取目标对象(实际是代理对象)。
    通过代理执行方法,实现aop的功能增强。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值