AOP通知类型

    前置通知:@Before,在连接点方法执行之前执行。
    后置通知:@After,在连接点方法执行之后,无论如何都会执行。
    环绕通知:@Around,在连接点方法执行之前和之后执行。连接点发生异常时,之后不执行。
    异常通知:@AfterThrowing,在连接点方法发生异常之后执行。
    返回通知:@AfterReturning,在连接点方法返回结果后执行。如果发生异常,则不会执行。

1、pom.xml

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>5.0.6.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.2</version>
    </dependency>
    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>
</dependencies>

2、业务类

public class UserService {
    public int addUser(String name) {
//        System.out.println(5/0);
        System.out.println("新增用户");
        return 1;
    }
}

3、切面类

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect
class UserAspects {
    @Pointcut("execution(public int com.it.huaxin.aop.UserService.addUser(..))")
    public void pointCut(){};

    @Before("pointCut()")
    public void userBefore() {
        System.out.println("@Before,前置通知");
    }

    @After("pointCut()")
    public void userAfter () {
        System.out.println("@After,后置通知");
    }

    @Around("pointCut()")
    public Object userAround (ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("@Around,环绕通知,执行方法之前");
        Object proceed = proceedingJoinPoint.proceed(new Object[]{"张三"});
        System.out.println("@Around,环绕通知,执行方法之后");
        return proceed;
    }

    @AfterThrowing("pointCut()")
    public void userThrowing () {
        System.out.println("@AfterThrowing,异常通知,方法发生异常之后执行");
    }

    @AfterReturning("pointCut()")
    public void userReturing() {
        System.out.println("@AfterReturning,返回通知 ");
    }
}

4、配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy
public class AopConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }

    @Bean
    public UserAspects userAspects() {
        return new UserAspects();
    }
}

5、测试类

import com.it.huaxin.aop.AopConfig;
import com.it.huaxin.aop.UserService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class AopTest {
    public static void main(String [] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);
        UserService bean = context.getBean(UserService.class);
        bean.addUser("张三");
    }
}

//结果:

@Around,环绕通知,执行方法之前
@Before,前置通知
新增用户
@Around,环绕通知,执行方法之后
@After,后置通知
@AfterReturning,返回通知 

// 发生异常,结果:

@Around,环绕通知,执行方法之前
@Before,前置通知
@After,后置通知
@AfterThrowing,异常通知,方法发生异常之后执行
Exception in thread "main" java.lang.ArithmeticException: / by zero
    at com.it.huaxin.aop.UserService.addUser(UserService.java:5)
    at com.it.huaxin.aop.UserService$$FastClassBySpringCGLIB$$c2371e8f.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:100)
    at com.it.huaxin.aop.UserAspects.userAround(UserAspects.java:24)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:47)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
    at com.it.huaxin.aop.UserService$$EnhancerBySpringCGLIB$$fcde3768.addUser(<generated>)
    at com.it.huaxin.test.AopTest.main(AopTest.java:11)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值