springboot使用AOP实现切面编程

springboot使用AOP实现切面编程

之前看日志里面有用到aop的技术所以想照着做一个过程如下

1创建一个@interface文件

package io.sirc.common.annotation;

import java.lang.annotation.*;

/**
 * 系统日志注解
 *
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysQueryLog {

	String value() default "";
}

2创建一个调用它的类,注意其中地址指向io.sirc.common.annotation.SysQueryLog是前面那货的地址

package io.sirc.common.aspect;

import io.sirc.common.utils.HttpContextUtils;
import io.sirc.common.utils.IPUtils;
import io.sirc.common.utils.R;
import io.sirc.modules.sea.entity.GetDataResponse;
import io.sirc.modules.sys.entity.SysQueryLogEntity;
import io.sirc.modules.sys.entity.SysUserEntity;
import io.sirc.modules.sys.service.SysQueryLogService;
import io.sirc.modules.sys.service.SysUserService;
import net.sf.json.JSONObject;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;


/**
 * 系统日志,切面处理类
 *
 */
@Aspect
@Component
public class SysQueryLogAspect {
	@Value("${isLocal}")
	private  boolean isLocal;

	@Autowired
	private SysQueryLogService sysQueryLogService;

    @Autowired
    private SysUserService sysUserService;
	
	@Pointcut("@annotation(io.sirc.common.annotation.SysQueryLog)")
	public void logPointCut() { 
		
	}
}

3.在SysQueryLogAspect 中添加方法,当然可以使用好几种标签@before,@after之类的  因为我现在需要的是进来之前判断参数中是否含有某些值 ,如果存在则中断不执行,执行方法后在执行日志插入操作,就使用@Around了,这样一下俩都能实现,

其中point是传进方法的参数,result是返回回去的值 ,point.proceed()是执行需要的接口,写在这上面的是调用接口之前执行的方法,写在下面的是执行之后的方法

@Around("logPointCut()")
	public GetDataResponse around(ProceedingJoinPoint point) throws Throwable {
        GetDataResponse result = new GetDataResponse();
        long beginTime = System.currentTimeMillis();
		//执行时长(毫秒)
		
		JSONObject jo = getParam(point);
        if(!isQueryLock(jo)) {
            result.setData(new R().ok().put("message","当前账号和ip已被锁定,请稍后再试。").toString());
            return result;
        }
        if(!isCompatible(jo)) {
            result.setData(new R().ok().put("message","当前账号和ip不匹配").toString());
            return result;
        }
        result= (GetDataResponse) point.proceed();
        long time = System.currentTimeMillis() - beginTime;
        saveSysQueryLog(jo, time);

		return result;
	}

4.在接口前面加上标签

@SysQueryLog
    public GetDataResponse getDataRequest(@RequestParam Map<String, Object> params) {
    //执行接口代码~~~~~~~~~~~~~~~~~
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2213.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 搭建Eurake集群

    搭建Eurake集群eureka作为SpringCloud的服务发现与注册中心,在整个的微服务体系中,处于核心位置。单一的eureka服务,显然不能满足高可用的实际生产环境,这就要求我们配置一个能够应对各种突发情况,具有较强容灾能力的eureka集群服务。其实我们只需要在部署时候,对eureka的配置文件做相应的修改,运行即可。在项目中,创建三个名字分别为eureka01,eureka02,eureka03的eur…

    2022年6月4日
    38
  • sha1() 函数

    sha1() 函数

    2021年10月12日
    54
  • 实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    实战DeviceIoControl 之中的一个:通过API訪问设备驱动程序

    2021年12月3日
    46
  • MOS管功率放大器电路图与原理图文及其解析[通俗易懂]

    MOS管功率放大器电路图与原理图文及其解析[通俗易懂]放大器电路的分类本文介绍MOS管功率放大器电路图,先来看看放大器电路的分类,按功率放大器电路中晶体管导通时间的不同可分:甲类功率放大器电路、乙类功率放大器电路和丙类功率放大器电路。甲类功率放大器电路,在信号全范围内均导通,非线性失真小,但输出功率和效率低,因此低频功率放大器电路中主要用乙类或甲乙类功率放大电路。功率放大器是根据信号的导通角分为A、B、AB、C和D类,我国亦称为甲、乙、甲乙、丙和丁类。功率放大器电路的特殊问题(1)放大器电路的功率功率放大器电路的任务是推动负载,因此功率放大电路的重

    2022年6月3日
    74
  • java四则运算

    java四则运算

    2021年9月29日
    40
  • pycharm 2021.11 激活码-激活码分享

    (pycharm 2021.11 激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html4M…

    2022年3月29日
    148

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号