Springboot自定义注解

本文详细介绍了如何使用SpringBoot通过自定义注解实现权限控制和日志模块的引用,包括定义注解接口、切面、枚举类、业务接口及测试接口的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  需求:通过Springboot自定义注解的方式来实现权限和日志模块的引用(这里侧重应用层面作用)。


1、工程描述


a1.png
  说明:InAuth.java为要定义的注解接口,AuthAspect.java为切面实现,UserAuthEnum.java为用户权限枚举,AuthServiceImpl.java为业务实现,Auth.java为对外提供接口(控制层)。


2、代码步骤


第一:定义注解接口

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface InAuth {
	UserAuthEnum[] limit() default {};
}

第二:定义切面

/*****************************************
 ***说明:这里重点介绍权限,忽略登录会话等***
 *****************************************/
@Aspect
@Component
@Configuration
public class AuthAspect {
	@Around("@annotation(inAuth)")
	public Object around(ProceedingJoinPoint point, InAuth inAuth) throws Throwable {
		UserAuthEnum[] ifAuth = inAuth.limit();// 获取接口权限
		if (ifAuth == null || ifAuth.length == 0) {
			return point.proceed(); // 该接口不需要权限
		}
		int[] limit = {10,20,100};  //将ifAuth转成权限码
		// 1、获取用户的会话Token,我们是放在ThreadLocal中的
		// 2、根据Token会话中取出用户的权限列表,会话存在redis中
		// 3、上面两步略,用户权限直接用数据模拟,我们用户权限返回的是Set
		// 4、可以加一些逻辑判断,返回一些异常情况
		Set<Integer> userSet = new HashSet<Integer>();
		userSet.add(1000) ;
		for (int lt : limit) {
			if (userSet.contains(lt)) {
				return point.proceed();
			}
		}
		return "no acess auth!";
	}
}

第三:定义权限的枚举类

public enum UserAuthEnum {
	A_ADMIN(10), // 管理员权限
	A_READ(20), // 只读权限
	A_UPLOAD(30), // 上报权限
	A_CHARTS(40), // 报表权限
	A_LIST(50);// 名单管理权限
	private int code;
	private UserAuthEnum(int code) {
		this.code = code;
	}
	public int getCode() {
		return this.code;
	}
}

第四:定义业务接口(引用自定的注解)

@Service("authService")
public class AuthServiceImpl implements AuthService {
	@Override
	@InAuth(limit={UserAuthEnum.A_CHARTS,UserAuthEnum.A_ADMIN}) //要么有管理员权限,要么有charts权限可以访问
	public String testAuth() {
		return "---auth test---";
	}
}

第五:定义切面

public interface EacProxy {
	 public String query();  //可以返回复杂对象类型
}

第六:定义测试接口

@RestController
public class Auth {
	@Autowired
	private AuthService authService ;

	@RequestMapping("/auth")
	public String sayHello() throws Exception {
		return authService.testAuth() ;
	}
}

  注解让代码代码世界更简洁、更简单了,但也存在缺点,让异常定位更麻烦,让理解spring执行原理更复杂(感觉从spring原理慢慢修理才是正道)。


3、打包下载


链接:https://pan.baidu.com/s/15upCKAvQerQr7zpuJNAy9Q 
提取码:i9dm 

  若链接莫名失效,可以留言联系,也可以按照上述的方式自行配置。

【更多可关注】更多可关注

SpringBoot中可以自定义注解来实现特定的功能。自定义注解的步骤如下: 1. 使用`@interface`关键字来定义注解,可以在注解中设置属性。 2. 可以通过注解的属性来传递参数,比如设置注解中的属性值。 3. 可以通过判断某个类是否有特定注解来进行相应的操作。 在SpringBoot中,自定义注解可以用于实现日志记录、定时器等功能。通过使用注解,可以简化代码,并提高开发效率。同时,自定义注解也是Spring框架中广泛应用的一种方式,可以在SpringMVC框架中使用注解来配置各种功能。而在SpringBoot框架中,更是将注解的使用推向了极致,几乎将传统的XML配置都替换为了注解。因此,对于SpringBoot来说,自定义注解是非常重要的一部分。123 #### 引用[.reference_title] - *1* *3* [springboot 自定义注解(含源码)](https://blog.youkuaiyun.com/yb546822612/article/details/88116654)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *2* [SpringBoot-自定义注解](https://blog.youkuaiyun.com/weixin_44809337/article/details/124366325)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值