本篇目标

  1. 告诉Spring AOP面向切面编程是什么;
  2. 基本概念;
  3. 通过方法名当切点和通过注解当切点方式的示例Demo;

面向切面编程与基本概念

什么是面向切面编程

实际工作中,会遇到一直业务场景,就是某些方法都要做相同的功能,比如,所有方法都要加上日志,某些方法需要加上监控,某些方法需要加上事务,这时候,如果在每个方法里面都写上相同的代码(比如写日志,上报监控),或者修改原有代码加上相同的逻辑,这样的代码写的就不够优雅,这时就需要面向切面编程的思想了。

面向切面编程,就是在一类事件上,都要执行那个逻辑(日志,监控,事务),抽出来。这个通用逻辑,可以被模块化为特殊的类,叫做切面(aspect)。需要执行这段通用逻辑的方法上叫做切点(poincut)

面向切面编程

基本概念

通知(Advice):通知定义了切面是什么以及什么时候执行。
Spring切面可以应用的5中类型的通知:
1. 前置通知(Before):在目标方法被调用之前调用通知功能;
2. 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
3. 返回通知(After-returning):在目标方法成功执行之后调用通知;
4. 异常通知(After-throwing):在目标方法抛出异常后调用通知;
5. 环绕通知(Around):通知包裹了被通知的方法,再被通知的方法调用之前和调用之后执行自定义的行为;

连接点(Join point):连接点是在应用执行过程中能够插入切面的一个点。

切点(Poincut):切点的定义会匹配通知索要组织入的一个或多个连接点。

切面(Aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容—-他是什么,在何时和何处完成功能。

引入(Introduction):引入允许我们向现有的类添加新方法或属性。

织入(Weaving):织入是把切面应用到目标对象并创建新的代理对象的过程。

演示代码

下面给了方法名当做切点和注解当做切点的两种方式:

方法名当切点

/**
     * 声明一个切点
     */
    @Pointcut("execution(* pers.wayss.springAOP.interceptor.HelloWorld.getMessage1(..))")
    public void pt1(){

    }

    /**
     * 在切点方法执行之前,执行此方法
     */
    @Before("pt1()")
    public void beforeHelloWorld1(){
        System.out.println("before Message1");
    }

注解当切点

    /**
     * 在切点注解的方法之前执行
     */
    @Before("@annotation(Anno)")
    public void annoBefore(){
        System.out.println("annoBefore");
    }

代码地址

如果有不理解的,建议参考代码,调试代码有助于理解。
https://github.com/wayss000/learnSpring/tree/master/SpringAOP

参考《Spring实战(第四版)》第四章

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐