1、springboot+自定义注解实现灵活的切面配置

利用aop我们可以实现业务代码与系统级服务例如日志记录、事务及安全相关业务的解耦,使我们的业务代码更加干净整洁。

首先创建一个springboot项目,并编写控制器

package com.fanghao.web;

@RestController
public class SampleController { @RequestMapping("/test11")
public int test11(String deviceId) {
return ;
}
@RequestMapping("/testGG")
public String testGG(String deviceId) {
return "testGG 切面测试!";
}
}

编写切面类,并配置切面

@Aspect
@Component
public class TestAspect {
@Pointcut("execution(public * com.fanghao.web.SampleController.test*(..))")
public void addAdvice(){} @Around("addAdvice()")
public Object Interceptor(ProceedingJoinPoint pjp){
Object result = null;
Object[] args = pjp.getArgs();
if(args != null && args.length >) {
String deviceId = (String) args[];
if(!"".equals(deviceId)) {
return "no anthorization";
}
}
try {
result =pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
return result;
}
}

这样下来我们就实现了一个简单切面,在切面中实现自己的数据安全认证等具体业务逻辑,此处只做一个简单判断,测试如下:

改进切面,实现自定义注解

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation { }
@Aspect
@Component
public class TestAspect {
/**
* && 满足指定规则的方法并且加了指定注解的方法才会被切面捕捉
* || 满足指定规则的方法或者加了指定注解的方法才会被切面捕捉
*/
// @Pointcut("execution(public * com.fanghao.web.SampleController.test*(..))")
// @Pointcut("execution(public * com.fanghao.web.SampleController.test*(..)) && @annotation(com.fanghao.aspect.MyAnnotation)")
@Pointcut("execution(public * com.fanghao.web.SampleController.test*(..)) || @annotation(com.fanghao.aspect.MyAnnotation)")
public void addAdvice(){} @Around("addAdvice()")
public Object Interceptor(ProceedingJoinPoint pjp){
Object result = null;
Object[] args = pjp.getArgs();
if(args != null && args.length >) {
String deviceId = (String) args[];
if(!"".equals(deviceId)) {
return "no anthorization";
}
}
try {
result =pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
return result;
}
}
@RestController
public class SampleController { @RequestMapping("/test11")
public int test11(String deviceId) {
return ;
}
@RequestMapping("/testGG")
public String testGG(String deviceId) {
return "testGG 切面测试!";
}
@MyAnnotation
@RequestMapping("/showDD")
public String showDD(String deviceId) {
return "showDD 注解切面测试!";
}
}

实际开发中我们可以将@Pointcut("execution(public * com.fanghao.web.SampleController.test*(..)) && @annotation(com.fanghao.aspect.MyAnnotation)")改为@Pointcut("execution(public * com.fanghao.web.*.*(..)) && @annotation(com.fanghao.aspect.MyAnnotation)")",这样在com.fanghao.web包下,只有我们加上@MyAnnotation注解的方法切面方法才会起作用

从零开始写Hystrix的更多相关文章

  1. 深入浅出React Native 3: 从零开始写一个Hello World

    这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...

  2. 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案

    引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...

  3. 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)

    从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...

  4. 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)

    从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...

  5. 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)

    从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...

  6. 读《架构探险——从零开始写Java Web框架》

    内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...

  7. 从零开始写一个Tomcat(叁)--请求解析

    挖坑挖了这么长时间也该继续填坑了,上文书讲到从零开始写一个Tomcat(贰)--建立动态服务器,讲了如何让服务器解析请求,分离servlet请求和静态资源请求,读取静态资源文件输出或是通过URLCla ...

  8. 【Java EE】从零开始写项目【总结】

    从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等... 被虐得不要不要的,即使是非常简单有时 ...

  9. 一起学习造轮子(二):从零开始写一个Redux

    本文是一起学习造轮子系列的第二篇,本篇我们将从零开始写一个小巧完整的Redux,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Promises/A+,Red ...

随机推荐

  1. vue_02day

    目录 vue_02 表单指令: 条件指令: 循环指令: 前端数据库: 分隔符: 过滤器: 计算属性: 监听属性: vue编译不生效,闪烁 冒泡排序: vue_02 表单指令: <form act ...

  2. BBS_02day

    目录 BBS_02day: 展示个人所有文章: 点赞,点彩功能: 评论功能: BBS_02day: 展示个人所有文章: def article_detail(request,username,arti ...

  3. wifidog 用户第一次访问网络流程图

    通过wifidog实现用户上网强制认证后,用户第一次访问网络的流程大致如下: 1.用户通过浏览器访问某一网页. 2.wifidog重定向用户请求到认证服务器. 3.认证服务器返回登录认证页面给用户. ...

  4. STM32Cube在Main里判断USB是否已连接到电脑

    首先添加这两个Includes: #include "usbd_def.h" #include "usbd_hid.h" 然后就可以在代码里用这个来判断是否有连 ...

  5. Leetcode 第135场周赛解题报告

    这周比赛的题目很有特点.几道题都需要找到一定的技巧才能巧妙解决,和以往靠数据结构的题目不太一样. 就是如果懂原理,代码会很简单,如果暴力做,也能做出来,但是十分容易出错. 第四题还挺难想的,想了好久才 ...

  6. 分布式RPC框架实现

    现在大部分的互联网公司都会采用微服务架构,但具体实现微服务架构的方式有所不同,主流上分为两种,一种是基于Http协议的远程调用,另外一种是基于RPC方式的调用.两种方式都有自己的代表框架,前者是著名的 ...

  7. ABP vNext中使用开源日志面板 LogDashboard

    ABP vNext 使用 logdashboard 本文示例源码:https://github.com/liangshiw/LogDashboard/tree/master/samples/abpvn ...

  8. ASP.NET的MVC请求处理流程

    1.用户打开浏览器,在地址栏输入某个网址的URL并回车,浏览器便开始像该URL指定的服务器发起HTTP请求 .2.服务器的网站服务系统(IIS)接收到该请求,先检查自己是否认识该类请求,如果认识就直接 ...

  9. 释放mac磁盘空间

    转发自:https://www.jianshu.com/p/722093bc3dea Mac清理磁盘空间主要讲述在Mac上工作清理磁盘空间的小技巧,本节主要讲述作为一名使用Mac开发的iOS工程师,需 ...

  10. windows下xshell连接虚拟机的CentOS 7

    1.虚拟机设置 2.虚拟机的“编辑”-“虚拟网络编辑器” 3.windows 中运行“cmd”,输入“ipconfig”查看ip,避免冲突 4.在虚拟机网络编辑器界面中,选择“VMnet8” 5.记住 ...