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. windows 打印刻录 代码规范及问题

    1.获取CString字节数 int z_Len = WideCharToMultiByte(CP_ACP, 0, z_FileXml.GetBuffer(), z_FileXml.GetLength ...

  2. HTTP Status 500 - Handler processing failed; nested exception is java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config

    今天在用idea搭建spring mvc时候报了这个错误,缺少jstl的依赖包.由于是使用的spring-core的依赖,而spring-core里面是有jstl的.这就郁闷了,最后是在自己的pom. ...

  3. 面对IBM与亚马逊的犄角攻势,微软云如何招架?

    亚马逊AWS和微软Azure是全球公有云的焦点.不就前公布的财报不久前公布的财报,这两家公司云计算的收入越来越接近,从数据显示来看,亚马逊的利润比微软稍高,有人称微软云的高增长来自于捆绑销售,背后真正 ...

  4. MUI实现上拉加载和下拉刷新

    编写存储过程分页(此处使用T-SQL) CREATE PROC [dbo].[Common_PageList] ( @tab nvarchar(max),---表名 @strFld nvarchar( ...

  5. asmlinkage的作用

    本文转载自:http://blog.chinaunix.net/uid-24945116-id-83893.html 学习啦! asmlinkage是个宏,使用它是为了保持参数在stack中.因为从汇 ...

  6. python 面向对象:类,作用域

    类(Class)和实例(Instance) 定义类是通过class关键字:class Student(object): pass class后面紧接着是类名,即Student接着是(object),表 ...

  7. Oracle 12c logminer测试

    首先开启归档:SQL> archive log list   Database log mode              Archive ModeAutomatic archival     ...

  8. asp.net c# 断点续传 下载 Accept-Ranges

    转自:http://www.cnblogs.com/90nice/p/3489287.html 1.因为要下载大文件 需要断点续传,使用多线程 分段下载 效率比较高,节省资源. 发点牢骚:下载可以用多 ...

  9. 如何使用jMeter对某个OData服务进行高并发性能测试

    For project reason I have to measure the performance of OData service being accessed parallelly. And ...

  10. UI层实现

    领域驱动设计实践 —— UI层实现   目录 1. User Interface 2. Controller 3.  DTO 4.  infrastructure层的公共组件 5. UI层类图 6. ...