惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
IT之家
IT之家
H
Heimdal Security Blog
Jina AI
Jina AI
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
T
Tailwind CSS Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Apple Machine Learning Research
Apple Machine Learning Research
有赞技术团队
有赞技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
WordPress大学
WordPress大学
AWS News Blog
AWS News Blog
C
Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
D
Darknet – Hacking Tools, Hacker News & Cyber Security
The Hacker News
The Hacker News
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
T
Threatpost
S
Securelist
P
Privacy International News Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
博客园 - 聂微东
博客园 - 叶小钗
J
Java Code Geeks
V
V2EX
博客园 - Franky
Spread Privacy
Spread Privacy
K
Kaspersky official blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Simon Willison's Weblog
Simon Willison's Weblog
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
C
Cybersecurity and Infrastructure Security Agency CISA
C
CERT Recently Published Vulnerability Notes
Latest news
Latest news
NISL@THU
NISL@THU
罗磊的独立博客
W
WeLiveSecurity
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园_首页
V
Visual Studio Blog

微风静语

用 codebase-memory-mcp 给 AI 编程加一层“代码记忆” EchoCraft - 专为独立开发者和小型团队打造的产品官网主题 Halo 站长必备:外链安全与流量分析神器——“链接工具箱”重磅升级! Halo插件开发:java17旧项目迁移至java21项目记录 Halo插件|一个面向创作者的多功能媒体处理工具集 分布式事务详解:从入门到精通 让你的网站初步适配PWA Halo主题 - 微浸:以轻量构建美学,用细节定义体验 深入理解Python爬虫技术:原理、实现与实践 Halo-2.20 新特性:自定义登录页面模版 vue3 中父子组件数据传输踩坑 将你的服务运维面板从宝塔替换为1panel Python实战项目:外星人入侵(源码分享) theme-hao主题适配友链自助提交插件 plugin-artalk 插件保姆级使用教程 plugin-blog-hao 插件部分功能演示 halo 插件开发踩坑记录(一) Thymeleaf 模版引擎语法浅记 信息洪流中的自我救赎 mac 系统里如何管理多个jdk版本 memso API 不完全指南 基础语法:从CPU角度看变量、数组、类型、运算、跳转、函数等语法 halo-theme-hao主题:artalk评论区美化 衡量个人成长 halo-theme-hao 主题魔改教程 分享一个魔改的 Artalk 评论系统邮件模版 halo-theme-hao 主题标签记录 开发一个 Halo2.0 的安全条跳转中台插件! Mac 软件推荐:使用 Mac 一年半来,我一直在用的软件! TypeScript教程---面向对象编程 软件版本命名规范 TypeScript教程---基础语法及编译设置 2024年家乡春季的第一场大雪 提问的智慧 基础篇:容器化部署技术 -—docker,从此摆脱多环境配置的苦恼! 普通本科的四年大学教育,给我带来了什么? 因果与平衡 程序的本质:代码是如何被执行的 软件开发者应该具备的基本提问素质 如何编写 Restful 风格的接口 探索力 Springboot入门基础篇 Springboot项目生成接口文档方法 Java 实体代码生成器 lombok 的使用 深入 Java 泛型 分布式版本控制工具 git 的基本使用 如何搭建前后端分离的项目 初识Vue3--令人焕然一新的使用逻辑和代码组织方式! 浅谈前端发展史 为什么要学习数据结构和算法 关于富文本编辑器 wangeditor 在 vue2 项目中的使用
springboot中如何使用注解来实现aop
webjing · 2022-11-22 · via 微风静语

1、自定义注解

通常情况下,自定义注解都是定义在 domain 包下的 annotation 包下。首先创建一个注解:

@Target(ElementType.METHOD)   //定义注解的使用范围为方法
@Retention(RetentionPolicy.RUNTIME )
@Documented
public @interface ApiLimitedRole {

}

对于上述代码的这三个注解它主要作用如下:

  1. @Target :注解的作用目标
参数作用
@Target(ElementType.TYPE)作用在接口,类,枚举,注解(如@restcontroller)
@Target(ElementType.FIELD)作用于字段,枚举的常量 @filed
@Target(ElementType.METHOD)作用于方法,@reqestmapping
@Target(ElementType.CONSTRUCTOR)作用于构造函数
@Target(ElementType.PARAMETER)作用于方法参数 @param
  1. @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();  
  
    }  
  
}
  1. @Aspect:把当前类标识为一个切面供容器读取
  2. @Pointcut:aop切入点,表示在什么条件下触发
  3. @annotation:声明以注解的方式来定义切点,注解为 ApiLimitedRole 的包路径
  4. @Before:前置增强方法的标识,表示在标有注解的方法前执行切面方法
  5. 其他方式:除了使用注解方式外,@pointcut中提供匹配规则 execution,写法可以表达为
@Pointcut("execution(* com.xxx.cloud.controller.*.(..))")

总结一下,其实在 Springboot 中创建自定义注解很简单,首先创建一个注解,声明其运行方式,接着创建一个类,进行面向切面编程,对生命的注解进行逻辑实现。