aop 拦截含有特定注解的类

1.功能点:使用aop拦截含有自定义注解的类

1.自定义注解

package com.zhuanche.common.dingdingsync;

import java.lang.annotation.*;

/**
 * @Author fanht
 * @Description 含有该注解的controller方法存储到mq
 * @Date 2019/2/28 上午11:26
 * @Version 1.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@Documented
public @interface DingdingAnno {
}

2.使用切面

package com.zhuanche.common.dingdingsync;

import org.aspectj.lang.JoinPoint;import org.aspectj.lang.Signature;import org.aspectj.lang.annotation.*;import org.aspectj.lang.reflect.MethodSignature;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;

import java.lang.reflect.Method;import java.util.Arrays;

/** * @Author fanht * @Description * @Date 2019/2/28 上午11:59 * @Version 1.0 */@Component@Aspectpublic class DingdingAspect {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Pointcut("execution(* com.zhuanche.controller.driverteam.DriverTeamController.*(..))")    public void pointCut(){        logger.info("含有自定义注解dingdingAnno的方法...");    }

    @Before("pointCut()  && @annotation(dingdingAnno) ")    public void dingdingVerify(JoinPoint joinPoint,DingdingAnno dingdingAnno){        System.out.println("&&&&&&&&&&&&&&&&&&&&");        logger.info(joinPoint.getSignature().getName() + ",入参:{" + Arrays.asList(joinPoint.getArgs() + "}"));    }

    @AfterReturning("pointCut() && @annotation(dingdingAnno)")    public void finish(JoinPoint jointPoint,DingdingAnno dingdingAnno){        logger.info(jointPoint.getSignature().getName() + "*********");        Signature signature = jointPoint.getSignature();        MethodSignature methodSignature = (MethodSignature) signature;        Method method = methodSignature.getMethod();        if (method != null){           dingdingAnno = method.getAnnotation(DingdingAnno.class);           if (dingdingAnno != null){               System.out.println(jointPoint.getTarget().getClass().getName());               System.out.println(jointPoint.getSignature().getName());               System.out.println(jointPoint.getArgs().length);           }        }

        System.out.println(jointPoint.getSignature().getName());    }}

3.配置aop
<context:component-scan base-package="com.zhuanche.**"/><!--开启aop注解 --><aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

4.在类上面添加特定注解
@ResponseBody@RequestMapping(value = "/driverTeamDetail")@DingdingAnnopublic AjaxResponse driverTeamDetail(DriverTeamRequest param){   logger.info("查询车队详情入参:"+ JSON.toJSONString(param));   CarDriverTeamDTO detail = carDriverTeamService.selectOneDriverTeam(param);   return AjaxResponse.success(detail);}

启动项目,遇到的几个问题:1.使用Jrebel 每次修改后,总是不成功,报各种异常。原因应该是 aop在spring启动时候就加载进去了,修改后需要重启;2.遇到的几个问题:1)启动报错

原因一般是point后面的地址错误,我的原因是后面多加了&& +自定义注解名称

2)没进入后置通知: 第一次的时候,写的是

@AfterReturning("within(com.zhuanche.controller..*) && @annotation(sdol)")没有成功,具体原因还不太清楚。

原文地址:https://www.cnblogs.com/thinkingandworkinghard/p/10453662.html

时间: 2024-10-31 08:48:04

aop 拦截含有特定注解的类的相关文章

用户操作拦截并作日志记录--自定义注解+AOP拦截

作为运营除了处理系统生产问题,还要处理大量的用户上报事件,这部分工作占用了大量的人力.所有考虑把一部分事件查询处理做成一个自助平台,让用户自行核查处理.于是就有了用户自助系统.考虑到如何计量这个工具平台具体的实现价值,需要做用户操作统计才能给出可信服的数据. 以上就是本文的背景.自助系统的架构就是传统的springmvc+spinrg+mybatis+oracle.想到日志记录首先想到的就是AOP拦截处理.网上相关的技术贴很多.简单的小项目遇到的问题一般度娘都能给解决了~\(≧▽≦)/~ 自定义

spring面向切面aop拦截器

spring中有很多概念和名词,其中有一些名字不同,但是从功能上来看总感觉是那么的相似,比如过滤器.拦截器.aop等. 过滤器filter.spring mvc拦截器Interceptor .面向切面编程aop,实际上都具有一定的拦截作用,都是拦截住某一个面,然后进行一定的处理. 在这里主要想着手的是aop,至于他们的比较,我想等三个都一一了解完了再说,因此这里便不做过多的比较. 在我目前的项目实践中,只在一个地方手动显示的使用了aop,那便是日志管理中对部分重要操作的记录. 据我目前所知,ao

使用AOP拦截器获取一次请求流经方法的调用次数和调用耗时

引语 作为工程师,不能仅仅满足于实现了现有的功能逻辑,还必须深入认识系统.一次请求,流经了哪些方法,调用了多少次DB操作,多少次API操作,多少次IO操作,多少CPU操作,各耗时多少 ? 开发者必须知道这些运行时数据,才能对系统的运行有更深入的理解,更好滴提升系统的性能和稳定性. 完成一次订单导出任务,实际上是一个比较复杂的过程:需要访问ES 来查询订单,调用 API 及访问 Hbase 获取订单详情数据,写入和上传报表文件,更新数据库,上报日志数据等:在大流量导出的情形下,采用批量并发策略,多

Spring/AOP框架, 以及使用注解

1, 使用代理增加日志, 也是基于最原始的办法 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class LoggingProxy { /* * 代理类, 基于接口 */ //要被代理的对象, 目标对象 private Icalculator target; //生成一个构造方法 public LoggingPr

从头认识Spring-3.5 简单的AOP日志实现(注解版)-某方法之前的前后记录日志

这一章节我们使用注解来简单实现AOP日志. 1.domain 蛋糕类: package com.raylee.my_new_spring.my_new_spring.ch03.topic_1_5; public class Cake { private String name = ""; public String getName() { return name; } public void setName(String name) { this.name = name; } } 烤炉

【框架】[Spring]AOP拦截-使用切点:AspectJExpressionPointcut-切点语言

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 用AspectJExpressionPointcut实现的切点比JdkRegexpMethodPointcut实现切点的好处就是,在设置切点的时候可以用切点语言来更加精确的表示拦截哪个方法! 可以精确到返回参数,参数类型,方法名. 当然,也可以模糊匹配. 这里用纯Java的方式和配置xml的方法都来演示一遍. 需要的包什么的就不解释了,如不动,请参考前面的. 首先,准备好原型对象P

【Spring】AOP之基于AspectJ注解总结与案例

林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka Spring除了支持Schema方式配置AOP,还支持注解方式:使用@AspectJ风格的切面声明.导入需要的包:aspectjweaver.jar.aopalliance-1.0.jar 一.基本使用方法 1.1.启用对@AspectJ的支持 Spring默认不支持@AspectJ风格的切面声明,为了支持需要使用如下配置: <!-- 启动@AspectJ支持 --> <!-- pr

(转)Spring使用AspectJ进行AOP的开发:注解方式

http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Spring使用AspectJ通过配置文件的方式来进行AOP的开发,现在就来讲怎样使用注解方式进行AOP的开发. 创建一个Web项目, 引入相关的jar包.所要导入的jar包如下:  引入Spring的配置文件.主要引入AOP的约束: <?xml version="1.0" encoding=

Autofac实现AOP拦截

本文主要是详解一下在ASP.NET Core中,采用替换后的Autofac来实现AOP拦截. Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果. 引入类库 nuget命令如下: Install-Package Autofac.Extras.DynamicProxy -Version 4.5.0 复制代码