上一篇中分析了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. Innosetup设置控制面版中的名称显示和图标

    //设置控制面板中程序图标UninstallDisplayIcon={app}\logo.ico //设置控制面板中程序的名称Uninstallable=yesUninstallDisplayName ...

  2. SSISDB8:查看SSISDB记录Package执行的消息

    在执行Package时,SSISDB都会创建唯一的OperationID 和 ExecutionID,标识对package执行的操作和执行实例(Execution Instance),并记录opera ...

  3. 10.SpringMVC注解式开发-处理器方法的参数

    1.逐个参数接收 只要保证请求参数名与该请求处理方法的参数名相同即可 // 请求参数名 与该处理器中的请求方法的参数名相同 ,即可接收前台传递过来的参数 public ModelAndView met ...

  4. 根治android studio无法预览xml布局的问题

    xml报错“Failed to load AppCompat ActionBar with unknown error.” 修改build-gradle文件中的appcompat包导入的版本,直接用“ ...

  5. Maven的下载及安装

    版权申明:本文为博主原创文章,欢迎大家转载.转载请声明转载处为:https://www.cnblogs.com/qxcxy-silence/p/10808321.html 1.下载Maven; 1). ...

  6. 这些JVM命令配置参数你知道吗?

    JVM是多数开发人员视为理所当然的Java功能和性能背后的重负荷机器.然而,我们很少有人能理解JVM是如何进行工作的—像任务分配和垃圾收集.转动线程.打开和关闭文件.中断和/或JIT编译Java字节码 ...

  7. 常用Linux文件系统

  8. SQLite3学习笔记(2)

      SQLite 创建表 SQLite 的CREATE TABLE 语句用于在任何指定的数据库创建一个新表. 创建新表,涉及到命名表.定义列及每一行的数据类型. CREATE TABLE 的基本语法如 ...

  9. CentOS7 解决不能切换中英文输入法的问题

    1. 运行 im-chooser(如果没有要先安装) $ im-chooser 2. 在打开的窗口选择 iBus,然后 Logout 再 Login, 输入法即可切换.

  10. Binary Search-使用二叉搜索树

    终于到二叉树了,每次面试时最担心面试官问题这块的算法问题,所以接下来就要好好攻克它~ 关于二叉树的定义网上一大堆,这篇做为二叉树的开端,先了解一下基本概念,直接从网上抄袭: 先了解下树的概念,bala ...