欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AOP使用总结

程序员文章站 2024-03-19 16:38:16
...

1. AOP简介

AOP是一种编程范式,它主要是为了将非功能模块与业务模块分离开来,让我们更好的管理这些非功能模块。

它的使用场景有:权限控制、日志打印、事务控制、缓存控制、异常处理

2. AOP使用

  1. 在类上注解 @Aspect
  2. 如果想在方法执行前做操作,那么注解@Before注解
  3. 如果想在方法执行后做操作,那么注解@After注解

五大Advice注解:

  • @Before 方法执行前执行该切面方法
  • @After 方法执行后执行该切面方法
  • @AfterThrowing 方法抛出异常后执行该切面方法
  • @AfterReturning 方法返回值后执行该切面方法
  • @Around 环绕注解,集合前面四大注解

2.1 @Aspect

注解在类上,表明此类是一个面向切面的类,同时也要记得在类上注解@Component或者@Service 将此类交给Spring管理

2.2 @Poincut

用来注解在方法上,表明此方法为切面方法

常用表达式有:

@Poincut("@annotation(myLogger)") //只拦截有注解为@myLogger的方法

@Poincut("within(com.pibigstar.service.*) ") //只拦截com.pibigstar.service包下的方法

//拦截public修饰符,返回值为任意类型,com.pibigstar.servce包下以Service结尾的类的所有方法,方法参数为任意
@Poincut("execution("public * com.pibigstar.service.*Service.*(..)") 

@Poincut("bean(*service)") //只拦截所有bean中已service结尾的bean中的方法

AOP使用总结

designators(指示器)常用的表达式

AOP使用总结

2.3 @Before

在方法执行下执行该切面方法,其用法与@Poincut类似

//只拦截com.pibigstar包下,并且注解为myLogger的方法
@Before("within(com.pibigstar..*) && @annotation(myLogger)")
public void printBeforeLog(MyLogger myLogger) {
    String host = IPUtil.getIPAddr(request);
    log.info("====IP:"+host+":开始执行:"+myLogger.description()+"=======");
}

2.4 @After

在方法执行后执行该切面方法

//方法结束后
@After("within(com.pibigstar..*) && @annotation(myLogger)")
public void printAfterLog(MyLogger myLogger) {
    log.info("=====结束执行:"+myLogger.description()+"=====");
}

2.5 @AfterThrowing

当方法抛出异常后执行该切面方法

@AfterThrowing(@annotation(myLogger)",throwing = "e")
public void printExceptionLog(MyLogger myLogger,Exception e) {
    log.info("======执行:"+myLogger.description()+"异常:"+ e +"=====");
}

2.6 @AfterReturning

方法有返回值,打印出方法的返回值

//方法有返回值
@AfterReturning(value = "@annotation(myLogger)",returning="result")
public void printReturn(Object result) {
    log.info("======方法的返回值:"+result+"========");
}

2.7 @Around

集合@Before,@After,@AfterReturning,@AfterThrowing 四大注解

//集合前面四大注解
    @Around("@annotation(myLogger)")
    public Object printAround(ProceedingJoinPoint joinPoint,MyLogger myLogger) {
        Object result = null;
        try {
            log.info("======开始执行:"+myLogger.description()+"=======");
            result = joinPoint.proceed(joinPoint.getArgs());
            log.info("======方法的返回值:"+result+"========");
        } catch (Throwable e) {
            e.printStackTrace();
            log.info("======执行异常"+ e +"=======");
        }finally {
            log.info("======结束执行:"+myLogger.description()+"=======");
        }
        return result;
    }
相关标签: AOP 切面