环境

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()) +" 前置日志");
}

总结

  1. 我想用AOP实现什么样的功能;-- 通知
  2. 我要对哪个方法进行处理; – 切点
  3. 将通知和切换整合起来 – 切面
  4. 定义切面类(@Aspect标注的类)时,记得注入给spring,所以@Component别忘了。

参考地址:

AOP中获取自定义注解的参数值

springboot-自定义注解

Spring AOP与自定义注解Annotation的使用

Spring AOP自定义注解并获取注解的参数相关推荐

  1. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  2. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

  3. java获取方法上的注解_Spring:使用Spring AOP时,如何获取目标方法上的注解

    当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等 自定义注解 packagecom.agent.annotation;importjava.lang.annotati ...

  4. Java之——Spring AOP自定义注解实现日志管理

    转载请注明出处:https://blog.csdn.net/l1028386804/article/details/80295737 1.定义日志类SystemLog package io.mykit ...

  5. java自定义注解及获取注解参数

    以前不知道注解有什么用,现在学到了框架,发现到处都是注解.所以搞明白注解的原理还是很有必要的. 要深入学习注解,我们就必须能定义自己的注解,并使用注解,在定义自己的注解之前,我们就必须要了解Java为 ...

  6. Spring Aop(五)——给Advice传递参数

    5 给Advice传递参数 Advice除了可以接收JoinPoint(非Around Advice)或ProceedingJoinPoint(Around Advice)参数外,还可以直接接收与切入 ...

  7. spring aop自定义切面打印入参和出参,以及切面获取注解的字段值.

    controller代码 @ApiOperation(value = "检查是否有兑换次数", response = Boolean.class)@ApiImplicitParam ...

  8. Spring AOP 自定义注解记录操作日志

    1.自定义注释 @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface ...

  9. 使用Spring AOP自定义注解方式实现用户操作日志记录

    1,开发环境 操作系统:Windows 7 JDK:1.8.0_161 Eclipse:Mars.2 Release (4.5.2) 2,自定义注解类UserLog @Target({ElementT ...

最新文章

  1. 太狠!33岁年薪50万:“复工第一天,谢谢裁掉我!” 网友:有底气!
  2. 深度 | 推荐系统评估
  3. 新僵尸病毒猖獗 Facebook成攻击目标
  4. 5年以上的Java程序员,千万别忽略这一点
  5. python安装了运行不了_python详细安装教程
  6. C#调用webservice(二)
  7. oracle 输出到页面,利用Xming 将Linux 图形界面输出到Windows上
  8. 关于数组首地址a、a+1、a[0]、a[0]+1、*a、*a、a+0的解析
  9. youleb多风格响应式博客wordpress主题模板
  10. 爬虫如何监听插件_NodeJS概述2-事件插件-简易爬虫
  11. [tensorflow]tensorflow2.0的优化理论
  12. Fuchsia编译及运行
  13. toad库进行分箱操作
  14. Wonderware Intouch 2014R2 SP1 安装教程
  15. listview 刷新某一个item
  16. Foxit Quick PDF Library License Key
  17. 平方米用计算机怎么计算公式,公式的换算和公式计算器
  18. 文件被清理了怎么恢复
  19. Bracket Sequencing
  20. 记录2020这个不平凡的农历新年

热门文章

  1. 【合集】云栖大会珍贵技术资料:20+覆盖容器技术、智能工业、大数据、开源数据库等(下)...
  2. 电脑硬盘删除的文件如何恢复
  3. Lucene 4.6.1 java.lang.IllegalStateException: TokenStream contract violation
  4. ROS 官翻 navigation Tutorials RobotSetup
  5. dataguard跨平台linux,Dataguard从库性能的监控
  6. “竞赛是我们招聘的主要渠道”——数据科学家与竞赛小咖畅谈
  7. 内部存储空间不足_手机存储空间不足怎么办 手机存储空间不足解决方法
  8. 【数据化运营模型】预估产品收入 新游戏用户规模预测模型
  9. 谈谈base中遇到的坑点 及 其他
  10. (软件工程复习核心重点)第八章面向对象方法学-第一节:面向对象方法学概述