Spring AOP 实现——使用annotation、pointcut、aspect

摘要:
常见的注解有@Override,@Deprecated,@SuppressWarnings。注解的注解,成为元注解。常见元注解有:@Retention,@TargetRetention有一个属性RetentionPolicy,包含3个值。RetentionPolicy.SOURCE不会保留在class,仅存为源文件。如@Data就是SOURCERetentionPolicy.CLASS保留在class,但不被虚拟机加载。如@BuilderRetentionPolicy.RUNTIME本文使用RUNTIMETarget有多个枚举值。ElementType本文的annotationpackagecom.tovan.hign.annocuts.aspect.annotation;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Retention@Targetpublic@interfaceDayDayUp{}2.pointcutpointcut有9种写法。executewithinthistargetargs@target@within@annotation@args本文使用@annotation实现pointcutpackagecom.tovan.hign.annocuts.aspect;importorg.aspectj.lang.annotation.Pointcut;publicclassDayDayUpPointCut{@PointcutpublicvoiddayDayUp(){}}3.aspect使用时获取方法、参数、操作返回值等packagecom.tovan.hign.annocuts.aspect;importlombok.extern.slf4j.Slf4j;importorg.aspectj.lang.ProceedingJoinPoint;importorg.aspectj.lang.annotation.Around;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.reflect.MethodSignature;importorg.springframework.stereotype.Service;@Aspect@Slf4j@ServicepublicclassDayDayUpAspect{@AroundpublicObjectenhanceDayDayUpthrowsThrowable{log.info("正在经过切片增强。enhanceDayDayUp");//[1]查看方法MethodSignaturemethodSignature=joinPoint.getSignature();log.info;//[2]查看参数名,参数值String[]argNames=methodSignature.getParameterNames();Object[]args=joinPoint.getArgs();for{log.info;}//[3]选择操作或者不操作,然后进行返回returnjoinPoint.proceed();}}4.controllercontroller调用packagecom.tovan.hign.annocuts.web;importcom.tovan.hign.annocuts.aspect.annotation.DayDayUp;importcom.tovan.hign.annocuts.vo.BaseRequest;importcom.tovan.hign.annocuts.vo.BaseResult;importlombok.extern.slf4j.Slf4j;importorg.springframework.web.bind.annotation.*;@RestController@RequestMapping@Slf4jpublicclassAopController{@PostMapping@DayDayUppublicBaseResultfuncDayDayUp{log.info;returnBaseResult.success("WEB-操作成功。

1.annotation

  1. 注解@Interface,代表一种标记。常见的注解有@Override,@Deprecated,@SuppressWarnings。以及@Data。
  2. 注解的注解,成为元注解。常见元注解有:@Retention,@Target
  3. Retention有一个属性RetentionPolicy,包含3个值。
RetentionPolicy.SOURCE 不会保留在class,仅存为源文件。如@Data就是SOURCE
RetentionPolicy.CLASS 保留在class,但不被虚拟机加载。如@Builder
RetentionPolicy.RUNTIME 本文使用RUNTIME
  1. Target有多个枚举值。ElementType

本文的annotation

package com.tovan.hign.annocuts.aspect.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DayDayUp {
}

2.pointcut

pointcut有9种写法。

execute
within
this
target
args
@target
@within
@annotation
@args

本文使用@annotation实现pointcut

package com.tovan.hign.annocuts.aspect;

import org.aspectj.lang.annotation.Pointcut;

public class DayDayUpPointCut {

    @Pointcut("@annotation(com.tovan.hign.annocuts.aspect.annotation.DayDayUp)")
    public void dayDayUp() {

    }
}

3.aspect

使用时获取方法、参数、操作返回值等

package com.tovan.hign.annocuts.aspect;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Service;

@Aspect
@Slf4j
@Service
public class DayDayUpAspect {

    @Around("com.tovan.hign.annocuts.aspect.DayDayUpPointCut.dayDayUp()")
    public Object enhanceDayDayUp(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("正在经过切片增强。enhanceDayDayUp");
        // [1] 查看方法
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
        log.info("方法 ={}", methodSignature.getMethod().getName());
        // [2] 查看参数名,参数值
        String[] argNames = methodSignature.getParameterNames();
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < argNames.length; i++) {
            log.info("参数 {} = {}", argNames[i], args[i]);
        }
        // [3] 选择操作或者不操作,然后进行返回
        return joinPoint.proceed();
    }
}

4.controller

controller调用

package com.tovan.hign.annocuts.web;

import com.tovan.hign.annocuts.aspect.annotation.DayDayUp;
import com.tovan.hign.annocuts.vo.BaseRequest;
import com.tovan.hign.annocuts.vo.BaseResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("aop")
@Slf4j
public class AopController {

    @PostMapping("func")
    @DayDayUp
    public BaseResult funcDayDayUp(@RequestBody BaseRequest baseRequest, @RequestParam String currentTime) {
        log.info("baseRequest={},currentTime={}", baseRequest, currentTime);
        return BaseResult.success("WEB-操作成功。name=" + baseRequest.getName());
    }

}

5.console

控制台输出

2020-05-21 16:53:25.673  INFO 12120 --- [nio-8080-exec-3] c.t.hign.annocuts.aspect.DayDayUpAspect  : 正在经过切片增强。enhanceDayDayUp
2020-05-21 16:53:25.678  INFO 12120 --- [nio-8080-exec-3] c.t.hign.annocuts.aspect.DayDayUpAspect  : 方法 =funcDayDayUp
2020-05-21 16:53:28.495  INFO 12120 --- [nio-8080-exec-3] c.t.hign.annocuts.aspect.DayDayUpAspect  : 参数 baseRequest = BaseRequest(name=这是参数)
2020-05-21 16:53:28.496  INFO 12120 --- [nio-8080-exec-3] c.t.hign.annocuts.aspect.DayDayUpAspect  : 参数 currentTime = today
2020-05-21 16:53:28.496  INFO 12120 --- [nio-8080-exec-3] c.tovan.hign.annocuts.web.AopController  : baseRequest=BaseRequest(name=这是参数),currentTime=today

免责声明:文章转载自《Spring AOP 实现——使用annotation、pointcut、aspect》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇基于业务场景进行关键词提取以及Python实现php可选缓存APC下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

spring5 源码深度解析----- AOP的使用及AOP自定义标签

我们知道在面向对象OOP编程存在一些弊端,当需要为多个不具有继承关系的对象引入同一个公共行为时,例如日志,安全检测等,我们只有在每个对象里引入公共行为,这样程序中就产生了大量的重复代码,所以有了面向对象编程的补充,面向切面编程(AOP),AOP所关注的方向是横向的,不同于OOP的纵向。接下来我们就详细分析下spring中的AOP。首先我们从动态AOP的使用...

springBoot AOP环绕增强、自定义注解、log4j2、MDC

(一)log4j2 maven配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>...

Spring Aop: 关于继承和execution target this @annotation

1.多态 target指通过这个对象调用的方法 (匹配标识对象的所有方法) getMethod() this指调用这个对象的方法 (匹配标识对象实现的方法)    getDeclaredMethod() target/this匹配类及其子类 2. execution(* com.dao.BaseDao.*(..)) && target(co...

Springboot整合AOP

AOP:Spring得核心之一,面向切面编程,底层是通过动态代理实现得。实现方式有两种:(1)基本JDK原生动态代理,被代理得类需要实现接口。  (2)基于CGLIB,类和接口都可以代理。 在没有使用boot框架时,使用ssm时,我们需要在配置文件中加上以下配置。    (1)配置切入点。 (2)编写切面类。  (3)将配置类与切入点结合。        ...

利用.NET4.0的DynamicObject来拦截调用实现AOP

利用AOP我们很容易的就能实现类似Log等业务无关的横切关注点,避免了这些代码在项目中不断的重复,利用.NET DLR 我们可以很容易的就实现一个简单的AOP,代码如下: using System;using System.Dynamic;using System.Reflection;namespace Zxf.Practices{public clas...

spring5 源码深度解析----- AOP代理的生成

在获取了所有对应bean的增强后,便可以进行代理的创建了。回到AbstractAutoProxyCreator的wrapIfNecessary方法中,如下所示: 1 protected static final Object[] DO_NOT_PROXY = null; 2 3 protectedObject wrapIfNecessary(Obje...