跟Rocky学AOP设计

使用AOP思想实现按钮的单击控制

AOP

在这里我也不会‘cv’它的书面定义,跟着我,从实际需求中我们一起去体会的它的意义。
开发中我们都做过增删改查吧,但是我们有没有考虑过,在对数据库操作的时候,执行前和执行后数据库内部做了哪些操作?其其实,数据库操作远不止增删改查,最重要的一点,当我们发出指令去增删改查的时候,它具体执行之前一定有个保存的操作,执行之后也会有相应其他的操作。这也是为什么我们在一定情况下可以恢复数据的原因。但是如果我们把执行命令的前后操作功能去掉,结果发现,这对我们的增删改查的意图没有什么影响。就好似在执行操作前后做的事情的功能完全独立与当前的操作。
简单的提取上述例子的重点:我们可以除了做增删改查之外还可以做额外的其他操作,例如备份一份数据等,但是这些操作完全不用我们去执行,它可以自动执行,而且随时可以去掉这个额外的功能,而不影响我们操作的结果。
这也是spring中对事物的管理机制

在举个登陆的例子
在这里插入图片描述
假如用户都在登陆时候连续点击登陆,如果我们不处理的话,那么点击几次就会有几次请求登陆,这显然不是我们想要的,今天我们就使用AOP的思想开解决这个问题。

Advice

这个是通知。它的作用是要作什么,什么时候做

JointPoint

这个是连接点。就是标示你可以通知(advice)的地方(方法)

PointCut

这个是切入点,这是需要切面的点,表示从哪里切。假如你的类有十个方法,那不一定全是要通知的,但是他们都是连接点,它的作用即使标示哪些连接点需要通知

Aspect

这个是切面。它是切入点和通知的结合

限制用户短时间内二次点击

项目实现思路:

  1. 写一个login方法(连接点,切入点)
  2. 当用户点击第一次的时候,记录点击时间
  3. 实现一个方法(advice),判断是否是短时间
  4. 非短时间内,继续执行click,短时间内return

在说明下,使用AOP的原因是想在没有感知和多余的操作下实现附加功能。在本例中就是在用户点击登陆按钮的时候 开发者不需要多做记时和提示操作,而是全部交给切面实现

AOP实现思路

  1. 自定义一个声明,实现动态传值,且目标是作用在方法上(SingleClickBehavior)

  2. 写一个切面类(SingleClickAspect)

    2.1 写方法 找到切入点

    切入点用Pointcut注释,参数使用execution。其作用是以方法执行时作为切入点触发 Aspect类

    2.2 写方法 处理切入点

    处理切入点也就是发送通知(Advice),什么时候发送通知。在本例子中要处理用户点击前后的事件,所用用around。通知类型还有 After,AfterReturning,AfterThrowing,Before

    2.2.1 切入点处理中要获取view对象,并设置tag,值为当前点击的时间

    Object[] args = joinPoint.getArgs();该方法可以获取传过来的所有参数,判断是否有view类型的值,有则强转view。
    第一次进入制定没有tag,此时设置tag
    第二次及以后 获得tag 获得点击时间,和当前时间做差,对比给定的时间间隔判断是否可继续执行点击
    可点击返回 joinPoint.proceed()
    不可点击返回null

  3. 使用 在login上使用注解SingleClickBehavior 并传值

@SingleClickBehavior(300)
public void login(View view) {
}

完整的项目地址 https://github.com/rocky123shine/AopSingleClick.git

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值