从零开始写Hystrix
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的更多相关文章
- 深入浅出React Native 3: 从零开始写一个Hello World
这是深入浅出React Native的第三篇文章. 1. 环境配置 2. 我的第一个应用 将index.ios.js中的代码全部删掉,为什么要删掉呢?因为我们准备从零开始写一个应用~学习技术最好的方式 ...
- 从零开始写redis客户端(deerlet-redis-client)之路——第一个纠结很久的问题,restore引发的血案
引言 正如之前的一篇博文,LZ最近正在从零开始写一个redis的客户端,主要目的是为了更加深入的了解redis,当然了,LZ也希望deerlet客户端有一天能有一席之地.在写的过程当中,LZ遇到了一个 ...
- 从零开始写一个武侠冒险游戏-8-用GPU提升性能(3)
从零开始写一个武侠冒险游戏-8-用GPU提升性能(3) ----解决因绘制雷达图导致的帧速下降问题 作者:FreeBlues 修订记录 2016.06.23 初稿完成. 2016.08.07 增加对 ...
- 从零开始写一个武侠冒险游戏-7-用GPU提升性能(2)
从零开始写一个武侠冒险游戏-7-用GPU提升性能(2) ----把地图处理放在GPU上 作者:FreeBlues 修订记录 2016.06.21 初稿完成. 2016.08.06 增加对 XCode ...
- 从零开始写一个武侠冒险游戏-6-用GPU提升性能(1)
从零开始写一个武侠冒险游戏-6-用GPU提升性能(1) ----把帧动画的实现放在GPU上 作者:FreeBlues 修订记录 2016.06.19 初稿完成. 2016.08.05 增加对 XCod ...
- 读《架构探险——从零开始写Java Web框架》
内容提要 <架构探险--从零开始写Java Web框架>首先从一个简单的 Web 应用开始,让读者学会如何使用 IDEA.Maven.Git 等开发工具搭建 Java Web 应用:接着通 ...
- 从零开始写一个Tomcat(叁)--请求解析
挖坑挖了这么长时间也该继续填坑了,上文书讲到从零开始写一个Tomcat(贰)--建立动态服务器,讲了如何让服务器解析请求,分离servlet请求和静态资源请求,读取静态资源文件输出或是通过URLCla ...
- 【Java EE】从零开始写项目【总结】
从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等... 被虐得不要不要的,即使是非常简单有时 ...
- 一起学习造轮子(二):从零开始写一个Redux
本文是一起学习造轮子系列的第二篇,本篇我们将从零开始写一个小巧完整的Redux,本系列文章将会选取一些前端比较经典的轮子进行源码分析,并且从零开始逐步实现,本系列将会学习Promises/A+,Red ...
随机推荐
- MySQL实战45讲学习笔记:第十七讲
一 .引子 我在上一篇文章,为你讲解完 order by 语句的几种执行模式后,就想到了之前一个做英语学习 App 的朋友碰到过的一个性能问题.今天这篇文章,我就从这个性能问题说起,和你说说 MySQ ...
- 【灵魂拷问】你为什么要来学习Node.js呢?
[灵魂拷问]你为什么要来学习Node.js呢? 学习node.js适合的人群: 需要必备一些HTML,CSS,JavaScript及编程有一定程度了解的读者阅读,一些简单的命令行操作,具备服务端开发经 ...
- [LeetCode] 486. Predict the Winner 预测赢家
Given an array of scores that are non-negative integers. Player 1 picks one of the numbers from eith ...
- [LeetCode] 277. Find the Celebrity 寻找名人
Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist o ...
- [LeetCode] 227. Basic Calculator II 基本计算器之二
Implement a basic calculator to evaluate a simple expression string. The expression string contains ...
- 主流的单元测试工具之-JAVA新特性-Annotation
1:什么是Annotation?Annotation,即“@xxx”(如@Before,@After,@Test(timeout=xxx),@ignore),这个单词一般是翻译成元数据,是JAVA的一 ...
- C#程序只允许运行一个实例的解决方案
最近在做winform的程序中,需要只能打开一个程序,如果已经存在,则激活该程序的窗口,并显示在最前端.在网上google了一哈,找到了很多的解决方案.这里我整理了3种方案,并经过了测试,现和朋友们分 ...
- Java学习:网络编程总结
Java网络编程总结 一.概述 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备( ...
- 【maven】idea的pom文件修改,引入新的jar包,无效,本地仓库始终没有下载新jar包的问题解决【idea pom Dependency not found】
引入问题: idea的pom文件修改,引入新的jar包,无效,本地仓库始终没有下载新jar包的问题解决[idea pom Dependency not found] 如题,引入一个新的jar包,在 ...
- .NET创建Windows定时任务
创建Windows定时任务教程 1.创建一个控制台应用程序,保证程序正常运行. 2.右键点击我的电脑->点击管理. 3.在计算机管理弹出框->展开计算机管理(本地)->展开系统工具- ...