AOP操作-AspectJ注解

1.创建类,在类里面定义方法

public class User {
    public void add(){
        System.out.println("add.....");
    }
}

2.创建增强类(编写增强逻辑)

  (1)在增强类里面,创建方法,让不同方法代表不同通知类型

//增强类
public class UserProxy {
    //前置通知
    public void before(){
        System.out.println("before....");
    }
}

3.进行通知的配置

  (1)在Spring配置文件在,开启注解扫描

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
                           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--开启注解扫描-->
    <context:component-scan base-package="hrf.spring5.aopanno"></context:component-scan>

  (2)使用注解创建User和UserProxy对象

  (3)在增强类上面添加注解@Aspect

  (4)在Spring配置文件中开启生成代理对象

    <!--开启AspectJ生成代理对象-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

4.配置不同类型的通知

  (1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置

  

//增强类
@Component
@Aspect //生成代理对象
public class UserProxy {
    //前置通知
    //@Before注解表示作为前置通知
    @Before(value = "execution(* hrf.spring5.aopanno.User.add(..))")
    public void before(){
        System.out.println("before....");
    }
    //最终通知
    @After(value = "execution(* hrf.spring5.aopanno.User.add(..))")
    public void after(){
        System.out.println("after。。。");
    }
    //后置通知(返回通知)
    @AfterReturning(value = "execution(* hrf.spring5.aopanno.User.add(..))")
    public void AfterReturning(){
        System.out.println("AfterReturning。。。");
    }
    //异常通知
    @AfterThrowing(value = "execution(* hrf.spring5.aopanno.User.add(..))")
    public void AfterThrowing(){
        System.out.println("AfterThrowing。。。");
    }
    //环绕通知
    @Around(value = "execution(* hrf.spring5.aopanno.User.add(..))")
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("环绕之前。。。");

        //被增强的方法执行
        proceedingJoinPoint.proceed();

    System.out.println("环绕之后。。。");
    }
}

  程序结果:

 

 

5.相同的切入点抽取

//相同切入点抽取
    @Pointcut(value = "execution(* hrf.spring5.aopanno.User.add(..))")
    public void pointdemo(){

    }

    //前置通知
    //@Before注解表示作为前置通知
    @Before(value = "pointdemo()")
    public void before(){
        System.out.println("before....");
    }

 

6.有多个增强类对同一个方法进行增强,设置增强类优先级

  (1)在增强类的上面添加注解@Orser(数字类型值),数字类型的值越小优先级越高

先执行

后执行

 

 运行结果:

  

 7.完全使用注解开发

  (1)创建配置类,不需要创建xml配置文件

 

posted @ 2021-12-01 10:15  Soleili  阅读(41)  评论(0编辑  收藏  举报