springboot+自定义注解实现灵活的切面配置
利用aop我们可以实现业务代码与系统级服务例如日志记录、事务及安全相关业务的解耦,使我们的业务代码更加干净整洁。
最近在做数据权限方面的东西,考虑使用切面对用户访问进行拦截,进而确认用户是否对当前数据有访问权限,而我们的项目是springboot项目,所以花时间研究了下springboot下切面的实现。
1、首先加入相关maven依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
2、编写控制器
@RestController
public class HelloController {
@RequestMapping("/add1")
public String addData1(String deviceId) {
return "success";
}
@RequestMapping("/add2")
public String addData2(String deviceId) {
return "success";
}
@RequestMapping("/add3")
public String addData3(String deviceId) {
return "success";
}
}
3、配置切面
@Aspect
@Component
public class TestAspect {
@Pointcut("execution(public * com.example.demo.controller.HelloController.add*(..))")
public void addAdvice(){}
@Around("addAdvice()")
public Object Interceptor(ProceedingJoinPoint pjp){
Object result = null;
Object[] args = pjp.getArgs();
if(args != null && args.length >0) {
String deviceId = (String) args[0];
if(!"03".equals(deviceId)) {
return "no anthorization";
}
}
try {
result =pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
return result;
}
}
这样下来我们就实现了一个简单切面,在切面中实现自己的数据安全认证,此处只做一个简单判断,测试如下:


4、但是这样的切面不够灵活,所以我们添加一个自定义注解
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation { }
5、修改切面类
@Aspect
@Component
public class TestAspect {
@Pointcut("execution(public * com.example.demo.controller.HelloController.add*(..)) && @annotation(com.example.demo.controller.MyAnnotation)" )
public void addAdvice(){}
@Around("addAdvice()")
public Object Interceptor(ProceedingJoinPoint pjp){
Object result = null;
Object[] args = pjp.getArgs();
if(args != null && args.length >0) {
String deviceId = (String) args[0];
if(!"03".equals(deviceId)) {
return "no anthorization";
}
}
try {
result =pjp.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
return result;
}
}
6、修改控制器,给需要切面的方法上加上注解
@RestController
public class HelloController {
@MyAnnotation
@RequestMapping("/add1")
public String addData1(String deviceId) {
return "success";
}
@RequestMapping("/add2")
public String addData2(String deviceId) {
return "success";
}
@RequestMapping("/add3")
public String addData3(String deviceId) {
return "success";
}
}
通过自定义注解,我们可以灵活的添加切面,在需要使用切面的方法上添加注解,测试如下:



实际开发中我们可以将"execution(public * com.example.demo.controller.HelloController.add*(..)) && @annotation(com.example.demo.controller.MyAnnotation)"改为"execution(public * com.example.demo.controller.*.*(..)) && @annotation(com.example.demo.controller.MyAnnotation)",这样在controller包下,只有我们加上@MyAnnotation注解的方法切面方法才会起作用。
springboot+自定义注解实现灵活的切面配置的更多相关文章
- [技术博客] SPRINGBOOT自定义注解
SPRINGBOOT自定义注解 在springboot中,有各种各样的注解,这些注解能够简化我们的配置,提高开发效率.一般来说,springboot提供的注解已经佷丰富了,但如果我们想针对某个特定情景 ...
- SpringBoot 自定义注解 实现多数据源
SpringBoot自定义注解实现多数据源 前置学习 需要了解 注解.Aop.SpringBoot整合Mybatis的使用. 数据准备 基础项目代码:https://gitee.com/J_look/ ...
- 使用IDEA创建SpringBoot自定义注解
创建SpringBoot项目 添加组织名 选择web 输入项目名称 创建后目录结构为 使用Spring的AOP先加入Maven依赖 <dependency> <groupId> ...
- SpringBoot自定义注解
1.注解的概念 注解是一种能被添加到java代码中的元数据,类.方法.变量.参数和包都可以用注解来修饰.注解对于它所修饰的代码并没有直接的影响. 2.注解的使用范围 1)为编译器提供信息:注解能被编译 ...
- Spring中如何使用自定义注解搭配@Import引入内外部配置并完成某一功能的启用
文章背景 有一个封装 RocketMq 的 client 的需求,用来提供给各项目收.发消息,但是项目当中常常只使用收或者发消息的单一功能,而且不同的项目 group 等并不相同而且不会变化,可以在项 ...
- SpringAOP03 项目脚手架、自定义注解、织入切面、引介增强
1 项目脚手架 利用 Maven 进行创建 1.1 利用IDEA创建一个Maven原型项目 技巧01:原型Maven项目是没有webapp文件夹和resources项目文件夹的,需要自己手动创建:创建 ...
- SpringBoot自定义注解、AOP打印日志
前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...
- java/springboot自定义注解实现AOP
java注解 即是注释了,百度解释:也叫元数据.一种代码级别的说明. 个人理解:就是内容可以被代码理解的注释,一般是一个类. 元数据 也叫元注解,是放在被定义的一个注解类的前面 ,是对注解一种限制. ...
- Spring 自定义注解,结合AOP,配置简单日志注解 (转)
java在jdk1.5中引入了注解,spring框架也正好把java注解发挥得淋漓尽致. 下面会讲解Spring中自定义注解的简单流程,其中会涉及到spring框架中的AOP(面向切面编程)相关概念. ...
随机推荐
- 淘宝IP地址库
淘宝官方ip地址库 http://ip.taobao.com/ 接口说明 1. 请求接口(GET): http://ip.taobao.com/service/getIpInfo.php?ip=[ip ...
- Java中的http(网络处理)相关的库:HttpClient,HttpCore(转载)
[背景] 最近和之前,折腾了这个: [教程]模拟登陆百度之Java代码版 然后,对于Java的HttpClient,有了点了解. 现在整理如下: Java本身没有Http相关的库 Java本身,没有内 ...
- elasticsearch(0.90.10)安装配置+超多插件!!
一)安装elasticsearch 1)下载elasticsearch-0.90.10,解压,运行\bin\elasticsearch.bat (windwos) 2)进入http://localho ...
- 萌新web前端从零开始(1)——计算机入门
前言:这是一个萌新从零开始的学习之路,与大家分享自己的看法与见解,还请指出错误与遗漏点方便改正. 1.认识计算机. 计算机语言常见的有C,PHP,Ruby,Java,C#,Basic,JS,C++等, ...
- .net core 使用redis 基于 StackExchange.Redis
一.添加引用包 StackExchange.Redis Microsoft.Extensions.Configuration 二.修改配置文件 appsettings.json { " ...
- java 编译器级别与项目版本不匹配
java compiler level does not match the v examime. java 编译器级别与项目版本不匹配. 解决: 在当前项目上点右键,属性 Pro ...
- jQuery为DOM动态追加事件
处理一个列表绑定,因为是一个展示项目,没有使用复杂的插件,直接jsrender写了个模板,但是后面有一个操作按钮,去查看数据详情,想到了jquery使用on进行事件委托,然后就开搞 最初是这样写的: ...
- DatagridView 控件列顺序与设置的不一样
解决方案如下 : 1. dataGridView1.AutoGenerateColumns = false; 2. 绑定的dataSource 中所有的列都要写进去(列一定是绑定的模型中属性) 先在界 ...
- OCP认证052考试最新考试题库和答案整理-33
33.Where Is backup metadata stored for use by Recovery Manager (RMAN)? A) In the control file B) In ...
- 在Java中如何优雅地判空
判空灾难 作为搬砖党的一族们,我们对判空一定再熟悉不过了,不要跟我说你很少进行判空,除非你喜欢NullPointerException. 不过NullPointerException对于很多猿们来 ...