springboot中如何使用注解来实现aop
AI-摘要
切换
dreamChaser AI GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
本文最后更新于 2024-02-28,文章内容可能已经过时。
1、自定义注解
通常情况下,自定义注解都是定义在 domain
包下的 annotation
包下。首先创建一个注解:
@Target(ElementType.METHOD) //定义注解的使用范围为方法
@Retention(RetentionPolicy.RUNTIME )
@Documented
public @interface ApiLimitedRole {
}
对于上述代码的这三个注解它主要作用如下:
- @Target :注解的作用目标
参数 | 作用 |
---|---|
@Target(ElementType.TYPE) | 作用在接口,类,枚举,注解(如@restcontroller) |
@Target(ElementType.FIELD) | 作用于字段,枚举的常量 @filed |
@Target(ElementType.METHOD) | 作用于方法,@reqestmapping |
@Target(ElementType.CONSTRUCTOR) | 作用于构造函数 |
@Target(ElementType.PARAMETER) | 作用于方法参数 @param |
- @Retention 注解保留生命周期
参数 | 作用 |
---|---|
source | 注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;被编译器忽略 |
class | 注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期 |
runtime | 注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在 |
示例:
// 在运行期进行切入
@Retention(RetentionPolicy.RUNTIME)
2.切面类
接着,创建一个切面类,这个类一般建立在 controller 包下的 aspect 包下
package com.imooc.api.aspect;
import com.imooc.api.support.UserSupport;
import com.imooc.bilibili.domain.annotation.ApiLimitedRole;
import com.imooc.bilibili.domain.auth.UserRole;
import com.imooc.bilibili.service.UserRoleService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* api的角色接口权限切面
* @author dreamChaser
* @date 2022-12-06
* @Order(1) 优先级,1 设置了较高的优先级
*/
@Order(1)
@Component
@Aspect
public class ApiLimitedRoleAspect {
@Resource
private UserSupport userSupport;
@Resource
private UserRoleService userRoleService;
@Pointcut("@annotation(com.imooc.bilibili.domain.annotation.ApiLimitedRole)")
public void check(){
}
@Before("check() && @annotation(apiLimitedRole)")
public void doBefore(JoinPoint joinPoint, ApiLimitedRole apiLimitedRole){
Long userId = userSupport.getCurrentUserId();
List<UserRole> userRoleList = userRoleService.getUserRoleByUserId(userId);
String[] limitedRoleCodeList = apiLimitedRole.limitedRoleCodeList();
}
}
- @Aspect:把当前类标识为一个切面供容器读取
- @Pointcut:aop切入点,表示在什么条件下触发
- @annotation:声明以注解的方式来定义切点,注解为 ApiLimitedRole 的包路径
- @Before:前置增强方法的标识,表示在标有注解的方法前执行切面方法
- 其他方式:除了使用注解方式外,@pointcut中提供匹配规则 execution,写法可以表达为
@Pointcut("execution(* com.xxx.cloud.controller.*.(..))")
总结一下,其实在 Springboot 中创建自定义注解很简单,首先创建一个注解,声明其运行方式,接着创建一个类,进行面向切面编程,对生命的注解进行逻辑实现。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,转载需要在文章开头或结尾注明来自于webjing的博客,
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果