上一篇中分析了AOP的实现原理,

总结为:

  • 判断对象是否需要被代理?@Aspect注解的实现是根据切入点表达式
  • 代理之后需要做什么,就是那些通知,本质上是实现了MethodInterceptor的拦截器
  • 如何让一个自定义的通知器生效?就是注入一个实现Advisor的bean

我们在使用@Aspect时通常都是使用表达式,基本上都是基于package级别的切,如果我们只想切某些较为分散的方法,这个时候配置表达式的话可能就不太方便啦,那么可以通过自定义注解,在需要的方法上加上这个注解就ok了

根据这些信息,我们可以自己仿写一个类@Aspect的功能

1.注入一个通知器,基于表达式的

@Component
public class MethodCustomAdvisor extends AbstractPointcutAdvisor { @Override
public Pointcut getPointcut() {
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
//定义切入点表达式
pointcut.setExpression("切入点表达式");
//基于method级别的注解
// AnnotationMatchingPointcut.forMethodAnnotation(MethodCustomAnnotation.class);
     //基于class级别的注解
// AnnotationMatchingPointcut.forClassAnnotation(ClazzCustomAnnotation.class);
return pointcut;
}
//绑定某个通知
@Override
public Advice getAdvice() {
return new MethodCustomInterceptor();
}
}

2. 定义一个拦截器(通知),表明这个通知要做什么,这样完全就可以啦

@Slf4j
public class MethodCustomInterceptor implements MethodInterceptor, Serializable { private Map<Method, Boolean> map = new ConcurrentHashMap<>(); @Override
public Object invoke(MethodInvocation invocation) throws Throwable {
log.error("ff========");
//譬如记录日志等等...... return invocation.proceed();
}
}

3.基于注解的实现

基于注解的话,完全就是将上面的表达式的判断部分改为注解的相关判断就可以啦,aop本身提供了方法级别和类级别的注解判断,只要自己定义一个注解写上去就OK啦

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface MethodCustomAnnotation { String name() default "name"; String value(); }

2.基于AOP自定义注解Annotation的实现的更多相关文章

  1. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

  2. ssm+redis整合(通过aop自定义注解方式)

    此方案借助aop自定义注解来创建redis缓存机制. 1.创建自定义注解类 package com.tp.soft.common.util; import java.lang.annotation.E ...

  3. spring AOP自定义注解方式实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  4. spring AOP自定义注解 实现日志管理

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在appli ...

  5. (转)利用Spring AOP自定义注解解决日志和签名校验

    一.需解决的问题 部分API有签名参数(signature),Passport首先对签名进行校验,校验通过才会执行实现方法. 第一种实现方式(Origin):在需要签名校验的接口里写校验的代码,例如: ...

  6. SpringBoot系列(十三)统一日志处理,logback+slf4j AOP+自定义注解,走起!

    往期精彩推荐 SpringBoot系列(一)idea新建Springboot项目 SpringBoot系列(二)入门知识 springBoot系列(三)配置文件详解 SpringBoot系列(四)we ...

  7. redis分布式锁-spring boot aop+自定义注解实现分布式锁

    接这这一篇redis分布式锁-java实现末尾,实现aop+自定义注解 实现分布式锁 1.为什么需要 声明式的分布式锁 编程式分布式锁每次实现都要单独实现,但业务量大功能复杂时,使用编程式分布式锁无疑 ...

  8. 使用AOP+自定义注解完成spring boot的接口权限校验

    记使用AOP+自定义注解完成接口的权限校验,代码如下: pom文件添加所需依赖: 1 <dependency> 2 <groupId>org.aspectj</group ...

  9. AOP自定义注解鉴权

    刚出来工作那会或者在学校的时候,经常听到说AOP(面向对象编程,熟称切面)的用途是日志.鉴权等.但是那会不会,后面学会了,又没有写博客记录,今天写给大伙,希望能帮到大家 一.学习目标:利用AOP+自定 ...

随机推荐

  1. 转 Git使用教程,最详细,最傻瓜,最浅显,真正手把手教

    预警:因为详细,所以行文有些长,新手边看边操作效果出乎你的预料) 这个也不错 https://www.cnblogs.com/qcloud1001/p/9796750.html 一:Git是什么?Gi ...

  2. python初始化定长列表

    >>> lst = ['x' for n in range(5)] >>> print(lst) ['x', 'x', 'x', 'x', 'x'] >> ...

  3. Saladict 沙拉查词

    Saladict 沙拉查词 鼠标中键呼出 整合了有道翻译.百度翻译.必应翻译.腾讯翻译君. Google 翻译和彩云小译等,自动发音,可配置词典. 说明文档:https://github.com/cr ...

  4. 如何在Marketing Cloud里创建extension field扩展字段

    首先在Marketing Cloud里找到创建扩展字段的tile入口,搜索关键字extension: 这会进入Fiori应用"Custom fields",能看到系统里所有创建好的 ...

  5. 14.MySQL主从复制

    1.复制的基本原理 三步骤 + 原理图 1.1 master将改变记录到二进制文件(binary log),这些记录过程叫做二进制日志事件, binary log events 1.2 slave 将 ...

  6. 6.Cookie和Session

    /*会话*/ (开一个浏览器,访问几个web资源,然后关闭浏览器,这个过程为一个对话) /*保存*/会话数据的两种技术(cookie session) 1.Cookie (客户端技术)(数据保存在客户 ...

  7. Django的配置模板路径

    Django的配置模板路径 找到settings.py 配置静态目录: 注:创建静态文件名就用static 不要用别的. 两个函数.  return   redirect ('http//:www.b ...

  8. list列表的使用

    Python最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 list1 = [1,2,3,4,5,6,7,8,9] #创建列表 z = list([1,2,3,4,5,6,7,8 ...

  9. 玩转springcloud(二):注册中心-Eureka

    一.简介 注册中心 注册中心是服务发现的核心.它保存了各个可用服务实例的网络地址(IP Address和Port).服务注册中心必须要有高可用性和实时更新功能. Netflix Eureka 就是一个 ...

  10. 十八,helm的原理及基础使用

    目录 helm介绍 核心术语 helm安装 helm安装 Tiller安装 创建tiller相关的rbac helm使用 添加chart源 helm常用命令: 基础命令 自定义chart 一.char ...