Spring AOP自定义注解并获取注解的参数
环境
springboot:1.5
Intellij IDEA:2021.1
序言
最近有个需求,要做方法层面的权限控制。以前在公司使用的是spring security
,然后使用注解
如下:
@PreAuthorize("hasPermission('', 'user:login')")
public String helloAdmin() {return "I am Admin";
}
但是目前这个项目,虽然引入了spring security
的依赖,但是在启动类中排出掉了;
我若开启,势必会要添加很多配置:URL放行、跨域问题等问题。
项目时间赶,没时间去弄。所以选择AOP自定义注解的方式来解决。
步骤
依赖
以下依赖的基础是,项目是springboot的项目:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
自定义注解
我自定义了一个TestAnnotation
注解:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TestAnnotation {String[] values();
}
连接点
其实就是方法。类中所有的方法,都是一个一个的连接点。
当具体到某个方法时,就变成切点
了
所以连接点仅仅只是个概念。
定义切点
切点:当明确类中某个方法需要被AOP
时,那么这个方法就是切点。
切点有两种写法:
① 表达式写法
②注解写法
我们先创建一个TestAspect
类:
@Aspect
@Component
public class TestAspect {// 这里面写切点和切面
}
表达式的写法
@Aspect
@Component
public class TestAspect {@Pointcut("execution(* com.sgy.service.impl..*.*(..)) || execution(* com.sgy.domain..*.*(..))")public void action() {}
}
注解的写法
@Aspect
@Component
public class TestAspect {@Pointcut("@annotation(com.sgy.securitydemo.annotation.TestAnnotation)")public void action() {//这个空方法就是为了挂切点}
}
定义切面
切面就是通知+切点;
想实现的功能、什么时候去做,在哪里做;
@Aspect
@Component
public class TestAspect {@Pointcut("@annotation(com.sgy.securitydemo.annotation.TestAnnotation)")public void action() {}//在目标方法被调用之前执行//目标方法:被@TestAnnotation注解的方法即为目标方法//@annotation中的值,需要和target方法中参数名称相同(必须相同,但是名称任意)@Before("@annotation(testAnnotation)")public void target(JoinPoint joinPoint, TestAnnotation testAnnotation) {System.out.println(Arrays.toString(testAnnotation.values()));}//写法二://也有这种写法:就是在@Before里面加入切点的空方法,其实没有必要。@Before("action() && @annotation(testAnnotation)")public void target(JoinPoint joinPoint, TestAnnotation testAnnotation) {System.out.println(Arrays.toString(testAnnotation.values()));}//写法三:@Before("action()")public void target(JoinPoint joinPoint) {MethodSignature sign = (MethodSignature)joinPoint.getSignature();Method method = sign.getMethod();TestAnnotation testAnnotation = method.getAnnotation(TestAnnotation.class);System.out.print("打印:"+ Arrays.toString(testAnnotation.values()) +" 前置日志");}
}
注意:
使用
@RestController
public class HelloController {@GetMapping("/hellono")@TestAnnotation(values = "{1,2,3}")public String hellono() {return "I am Admin";}
}
执行结果:
其他概念:
引入
就是把切面用到目标类中;所以它只是个概念,具体框架已经帮我们做了。
目标
切点作用的地方。也就是具体某个方法。
织入
把切面应用到目标对象来创建新的代理对象的过程。
遇到的问题
ProceedingJoinPoint as first parameter is allowed only in @Around advices
下面参数中:ProceedingJoinPoint
会报错,因为ProceedingJoinPoint
只是给@Around
用的。
@Before("action()")
public void target(ProceedingJoinPoint joinPoint) {MethodSignature sign = (MethodSignature)joinPoint.getSignature();Method method = sign.getMethod();TestAnnotation testAnnotation = method.getAnnotation(TestAnnotation.class);System.out.print("打印:"+ Arrays.toString(testAnnotation.values()) +" 前置日志");
}
总结
- 我想用AOP实现什么样的功能;-- 通知
- 我要对哪个方法进行处理; – 切点
- 将通知和切换整合起来 – 切面
- 定义切面类(
@Aspect
标注的类)时,记得注入给spring
,所以@Component
别忘了。
参考地址:
AOP中获取自定义注解的参数值
springboot-自定义注解
Spring AOP与自定义注解Annotation的使用
Spring AOP自定义注解并获取注解的参数相关推荐
- spring AOP自定义注解方式实现日志管理
转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...
- spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)
spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...
- java获取方法上的注解_Spring:使用Spring AOP时,如何获取目标方法上的注解
当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等 自定义注解 packagecom.agent.annotation;importjava.lang.annotati ...
- Java之——Spring AOP自定义注解实现日志管理
转载请注明出处:https://blog.csdn.net/l1028386804/article/details/80295737 1.定义日志类SystemLog package io.mykit ...
- java自定义注解及获取注解参数
以前不知道注解有什么用,现在学到了框架,发现到处都是注解.所以搞明白注解的原理还是很有必要的. 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为 ...
- Spring Aop(五)——给Advice传递参数
5 给Advice传递参数 Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入 ...
- spring aop自定义切面打印入参和出参,以及切面获取注解的字段值.
controller代码 @ApiOperation(value = "检查是否有兑换次数", response = Boolean.class)@ApiImplicitParam ...
- Spring AOP 自定义注解记录操作日志
1.自定义注释 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ...
- 使用Spring AOP自定义注解方式实现用户操作日志记录
1,开发环境 操作系统:Windows 7 JDK:1.8.0_161 Eclipse:Mars.2 Release (4.5.2) 2,自定义注解类UserLog @Target({ElementT ...
最新文章
- 太狠!33岁年薪50万:“复工第一天,谢谢裁掉我!” 网友:有底气!
- 深度 | 推荐系统评估
- 新僵尸病毒猖獗 Facebook成攻击目标
- 5年以上的Java程序员,千万别忽略这一点
- python安装了运行不了_python详细安装教程
- C#调用webservice(二)
- oracle 输出到页面,利用Xming 将Linux 图形界面输出到Windows上
- 关于数组首地址a、a+1、a[0]、a[0]+1、*a、*a、a+0的解析
- youleb多风格响应式博客wordpress主题模板
- 爬虫如何监听插件_NodeJS概述2-事件插件-简易爬虫
- [tensorflow]tensorflow2.0的优化理论
- Fuchsia编译及运行
- toad库进行分箱操作
- Wonderware Intouch 2014R2 SP1 安装教程
- listview 刷新某一个item
- Foxit Quick PDF Library License Key
- 平方米用计算机怎么计算公式,公式的换算和公式计算器
- 文件被清理了怎么恢复
- Bracket Sequencing
- 记录2020这个不平凡的农历新年
热门文章
- 【合集】云栖大会珍贵技术资料:20+覆盖容器技术、智能工业、大数据、开源数据库等(下)...
- 电脑硬盘删除的文件如何恢复
- Lucene 4.6.1 java.lang.IllegalStateException: TokenStream contract violation
- ROS 官翻 navigation Tutorials RobotSetup
- dataguard跨平台linux,Dataguard从库性能的监控
- “竞赛是我们招聘的主要渠道”——数据科学家与竞赛小咖畅谈
- 内部存储空间不足_手机存储空间不足怎么办 手机存储空间不足解决方法
- 【数据化运营模型】预估产品收入 新游戏用户规模预测模型
- 谈谈base中遇到的坑点 及 其他
- (软件工程复习核心重点)第八章面向对象方法学-第一节:面向对象方法学概述