Spring实战 (四) AOP

徘徊边缘 提交于 2020-02-29 08:15:21

在软件开发中,分布于应用多出的功能被称为和横切关注点. 通常,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑中).将这些横切关注点与业务逻辑相分离正是面向切面编成(AOP)所要解决的

要了解什么是AOP,首先应该了解AOP相关术语,只有完全理解这些,才能更好的掌握AOP

描述切面的常用术语有 通知(advice), 切点(pointcut), 连接点(join point).

通知(advice)

切面有目标-他必须要完成的工作,成为通知.通知定义了切面是什么以及何时使用.

Spring切面可以应用5种类型的通知

  • Before                在方法被调用之前调用通知
  • After                  在方法完成之后调用通知,无论方法执行是否成功
  • After-returning    在方法成功执行之后调用通知
  • After-throwing     在方法抛出异常后调用通知
  • Around                通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为
连接点(join point) 

连接点是在应用执行过程中能够插入切面的一个点.这个点可以是调用方法时,抛出异常时,甚至修改一个字段时.切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为

切点(pointcut) 

切点的定义会匹配通知所要织入的一个或多个连接点

切面(Aspect) 

切面是通知和切点的结合,通知和切点共同定义了关于切面的全部内容-它是什么,在何时和何处完成其功能

Spring提供了4种各具特色的AOP支持

  • 基于代理的经典AOP
  • @AspectJ注解驱动的切面
  • 纯POJO切面
  • 注入式AspectJ切面(适合Spring各个版本)
以下介绍如何使用注解,在Spring使用AOP

在XML文件中添加如下代码

<aop:aspectj-autoproxy>
现在开始就可以使用@AspectJ注解来开启AOP,有意思的是,虽然我们使用@AspectJ注解作为指引来创建基于代理的切面,但本质上它仍然是一个Spring风格的切面.

以下代码创建一个POJO使其成为切面

@Aspect
public class LogAOP {
    //sevice包及其子包所有类的所有方法
    @Pointcut("execution(* com.kenshiro.service..*.*(..))")
    public void log(){}

    @Before("log()")
    public void beforeLog(){
        System.out.println("方法前执行");
    }

    @AfterReturning("log()")
    public void AfterLog(){
        System.out.println("方法成功返回执行");
    }

    @Around("log()")
    public void AroundLog(ProceedingJoinPoint joinpoint){
        System.out.println("方法之前执行");
        joinpoint.proceed();  //执行业务代码
        System.out.println("方法之后执行");
    }
}

就是这么简单,一个简单的POJO加上一个@Aspect ,定义一个或者多个切点(pointcut).N个通知方法(advice).

切点配合通知便是切面,切面便是AOP(在什么位置,什么时候,做什么)

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!