1.基本概念

1.1 aop

即面向切面编程,优点是耦合性低,能使业务处理和切面处理分开开发,扩展和修改方面,当引入了注解方式时,使用起来更加方便。

1.2 应用场景

打日志、分析代码执行时间、权限控制、事务处理、访问频率控制、异常处理等等。

1.3 主要概念

几乎所有涉及aop的地方都会对这些概念进行说明,这里只说说个人的理解,可先了解一下基本概念,然后看完例子之后回头结合这些概念,才能更深刻的理解。

Aspect:关注点的模块化。类似于类声明,包含PointCut和对应的Advice。在Spring AOP中被定义为接口@Aspect,作用于TYPE(类、接口、方法、enum)

JoinPoint:程序执行过程中明确的点,如方法的调用或特定的异常被抛出。常用的是getArgs()用来获取参数,getTarget()获得目标对象。

Pointcut:表示一组JoinPoint,这些JoinPoint或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。 在Spring AOP中被定义为作用于METHOD上的接口@Pointcut

Introduction:添加方法或字段到被通知的类。

Advice: 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个JoinPoint之前、之后还是代替执行的代码。

Target Object:包含连接点的对象。也被称作被通知或被代理对象。POJO

Weaving:组装方面来创建一个被通知对象。

2.原理浅析

2.1 UML

对于AOP的理解,首先需要看下UML图,大致有个概念。

2.2 配置文件方式实现aop

如果需要理解一样东西,首先要会用,再此基础上理解才会更加深刻。这里给出一个例子,例子原文http://www.cnblogs.com/hongwz/p/5764917.html

这个例子相对比较容易理解一点,TimeHandler是Aspect,"execution(* com.bird.service.impl.PersonServiceBean.*(..))"是PointCut,before/after 是Advice,helloWordImpl1/helloWordImpl2是目标对象。

3. 注解实现

3.1 示例

aop实现一般是针对现有代码基础上做一些其他操作,例如下面代码所示。

这里一切以IOC为基础

@Aspect修饰类,说明该类是切面关注的抽象,即针对切面目标对象要做什么操作。

@Pointcut针对Spring MVC的RequestMapping和ResponseBody注解(@Iterface)。

@Before、@After、@AfterReturing等针对目标对象相应动作(before、after等)做出相应的操作。

JoinPoint joint 可以获取目标对象的参数。Object[] argcs= joinPoint.getArgs(); argcs类似于main方法的参数数组,只不过这里需要类型转换把Object转换成相应的type。

3.2 实现

这里以限制访问频率举例。在Controller上加上注解,设置参数就可以实现控制用户的某个时间段内的访问次数。用到Redis,如果没有Redis,可以用LocalThread代替。

1. 自定义注解

  

@Retention(RetentionPolicy.RUNTIME) :

这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。此外RetentionPolicy.SOURCE —— 这种类型的Annotations只在源代码级别保留,编译时就会被忽略;RetentionPolicy.CLASS —— 这种类型的Annotations编译时被保留,在class文件中存在,但JVM将会忽略

@Target

定义注解的作用目标。@Target(ElementType.FIELD)表示该注解可以作用于类或者方法上

@Order

当有多个切面时,Order决定先执行哪个后执行哪个。如果不加Order则默认按照注解标注的先后顺序执行。@Order(Ordered.HIGHEST_PRECEDENCE)表示最高优先级。

2.自定义切面

如图所示@Aspect表示了该类是切面。

@within:用于匹配所以持有指定注解类型内的方法;@annotation(limit) 是匹配含有limit注解的方法。

@Before("within(@org.springframework.stereotype.Controller *) && @annotation(limit)") 表示对含有SpringMVC的Controller注解下面的方法 且含有 注解limit的方法有效。

jointPoint获取HttpServletRequest(被修饰的方法需要有HttpServletRequest参数)

redis/Jedis不熟悉的只需要了解下两个方法就行:incr方法表示为key值加1,如果key不存在则新建一个key值,并初始化为1。expire表示经过time时间后key会消失。

逻辑是某个Ip地址对某个接口url,在过期时间内如果超过规定的次数就会抛出访问频率过高的异常。

3.在需要修饰的对象上加注解使用

4.如果注解没有生效,检查下spring配置文件是否配置了aop

自定义注解实现(spring aop)的更多相关文章

  1. 【java自定义注解2】java自定义注解结合Spring AOP

    承接上一篇,注解应用于属性,本篇定义了一个用于方法的注解,结合Spring AOP 实现 切面编程. 以下demo演示使用了SpringBoot,与SSM中使用方式大致相同,效果如下: 1.自定义注解 ...

  2. 基于注解的Spring AOP的配置和使用

    摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...

  3. 基于注解的Spring AOP示例

    基于注解的Spring AOP示例 目录 在XML配置文件中开启 @AspectJ 支持 声明切面及切入点 声明通知 测试 结语 在XML配置文件中开启 @AspectJ 支持 要使用Spring的A ...

  4. 基于注解的Spring AOP的配置和使用--转载

    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...

  5. Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现

    转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...

  6. Spring 自定义注解,结合AOP,配置简单日志注解 (转)

    java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...

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

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

  8. 自定义注解(spring)

    终于有时间可以在这里写一篇博文了,今天写一下我在项目中用到的自定义注解,就是在每次操作项目的时候,想把它的操作加在我的数据库中,简单地说就是日志管理,这些东西都写完之后,我就问我自己,问什么要自定义注 ...

  9. 基于注解的Spring AOP入门、增强Advice实例

    这篇文章简单通过一个例子,介绍几种增强的基本配置,以方便spring框架初学者对aop的代码结构有个清楚的了解认识.首先,spring支持aop编程,支持aspectJ的语法格式来表示切入点,切面,增 ...

  10. 一个最简单的通过自定义注解形式实现AOP的例子

    1.首先实现AOP实例的第一步即声明切面类,两种方式(1.基于注解形式@Aspect,2.基于xml配置,一般都通过注解来声明切面类) 2.切入点表达式大致也有两种,一种是直接根据方法的签名来匹配各种 ...

随机推荐

  1. 并发包Semaphore实现信号灯

    /** * * @描述: Semaphore实现信号灯 . * Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的线程个数,例如实现一个文 ...

  2. jdbc 块提取方式

    最近使用jdbc方式查询数据,保存为csv文件中.当然你可以在pl/sql中直接查出来,copy to excel就好了.但我想通过程序实现 1 @Test 2 public void test() ...

  3. js中构造函数和普通函数的区别

    this简介: this永远指向当前正在被执行的函数或方法的owner.例如: 1 2 3 4 5 function test(){   console.log(this); } test(); // ...

  4. ZT C,C++表达式求值顺序 裘老的解释。 [问题点数:300分]

    http://bbs.csdn.net/topics/370153775 [置顶] [推荐] C,C++表达式求值顺序 裘老的解释. [问题点数:300分] 最近这问题有从日经变时经的趋势,这里贴出裘 ...

  5. ABAP SICF服务和Java Servlet的比较

    In my opinion ABAP ICF handler and Java Servlet play the same role in enhancement which enables your ...

  6. PHP 字符串补0

    转自:https://www.cnblogs.com/bluebirds/archive/2016/11/22/6091099.html#undefined 概述:项目中经常会使用到在一串编码左边.右 ...

  7. 学习WebSocket一(WebSocket初识)

    Java EE 7 去年刚刚发布了JSR356规范,使得WebSocket的Java API得到了统一,Tomcat从7.0.47开始支持JSR356,这样一来写WebSocket的时候,所用的代码都 ...

  8. 一个关于JSON的异常,获取List对象失败的。。。

    重要的事情放在最前面,,以后不管遇到什么异常都一定要把异常读懂再想办法怎么解决,把异常读懂,异常读懂...... 这个异常我记得以前遇到过,而且好像已经做了笔记,,,,,今天翻了一下竟然没有,,,,, ...

  9. CentOS 安装 dokuwiki

    前期准备:yum 安装httpd和mysql 1.下载dokuwiki安装包 http://download.dokuwiki.org/: 2.centos系统中httpd的根目录为:/var/www ...

  10. 【BZOJ3757】苹果树(树上莫队)

    点此看题面 大致题意: 每次问你树上两点之间路径中有多少种颜色,每次询问可能会将一种颜色\(a\)看成\(b\). 树上莫队 这题是一道树上莫队板子题. 毕竟求区间中有多少种不同的数是莫队算法的经典应 ...