Spring启动时获取自定义注解的属性值
1.自定义注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface PermissionOperation {
/** * 权限Code * @return */
String code();
/** * 权限描述 * @return */
String description();
}
2.场景
在项目中遇到一个场景,想获取所有注解为@PermissionOperation的code和description值保存到数据中,将所有的权限操作在启动的时候同步到数据库中,在Spring启动的时候获取特定注解@PermissionOperation的所有属性值,首先想到的是写一个监听器然后监听ApplicationListener 事件,具体代码如下:
@Component
public class StartupListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
//获取@JalorOperation注解的所有bean
Map<String,Object> map= ContextHolder.getContext().getBeansWithAnnotation(PermissionOperation.class);
//循环判断是否存在,获取属性值
}
}
但是这里是有问题的,因为一旦spring管理的bean中Scope注解为session/request的时候有时候会出现问题。
3.利用BeanPostProcessor接口
@Component
public class MyListenerProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
Method[] methods = ReflectionUtils.getAllDeclaredMethods(bean.getClass());
if (methods != null) {
for (Method method : methods) {
PermissionOperation permissionOperation = AnnotationUtils.findAnnotation(method, PermissionOperation.class);
if (null != permissionOperation) {
//插入到数据中
System.out.println(permissionOperation.code());
System.out.println(permissionOperation.description());
}
}
}
return bean;
}
}
Spring管理的bean初始化化完成之后执行这个方法,我们就可以在这里进行一系列的逻辑。
4.例子
这里启动之后要获取到code和description值
@RestController
@RequestMapping(value = "access")
public class UserController {
/** * @param id * @return */
@GetMapping("add")
@PermissionOperation(code = "权限Code1", description = "添加用户")
public int addUser(@RequestParam Integer id) {
System.out.println("UserController add is running");
return Integer.MAX_VALUE;
}
/** * @param id * @return */
@DeleteMapping("del")
@PermissionOperation(code = "权限Code2", description = "删除用户")
public int delUser(@RequestParam Integer id) {
System.out.println("UserController delete is running");
return Integer.MAX_VALUE;
}
}
可以看到在控制台打印出:
权限Code1
添加用户
权限Code2
删除用户
本文转载自:https://blog.csdn.net/qianyiyiding/article/details/77150864
Spring启动时获取自定义注解的属性值的更多相关文章
- jquery下拉列表选中项改变时获取新选项的属性值
$("#textSel").change(funtion(){ var selVal=$(this).val(); var selText=$("#textSel opt ...
- 使用AOP获取自定义注解的内容
目录结构: 一:自定义注解 package org.example.annotation; import java.lang.annotation.ElementType; import java.l ...
- Spring中如何使用自定义注解搭配@Import引入内外部配置并完成某一功能的启用
文章背景 有一个封装 RocketMq 的 client 的需求,用来提供给各项目收.发消息,但是项目当中常常只使用收或者发消息的单一功能,而且不同的项目 group 等并不相同而且不会变化,可以在项 ...
- 让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean
让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean 问题描述 实现思路 思路一 [不符合要求] 思路二[满足要求] 思路三[未试验] 问题描述 目前我工作环境下,后端主要的框架 ...
- Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
1.Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理 2. 自定义注解: 使用@interfac ...
- 7 -- Spring的基本用法 -- 10... 获取其他Bean的属性值;获取Field值;获取任意方法的返回值
7.10 高级依赖关系配置 组件与组件之间的耦合,采用依赖注入管理:但基本类型的成员变量值,应直接在代码中设置. Spring支持将任意方法的返回值.类或对象的Field值.其他Bean的getter ...
- AOP中获取自定义注解的参数值
目录 一.利用注解实现AOP的基本流程 1.1.创建一个注解,用来注解切点(pointcut) 1.2.创建一个service,使用上面定义的注解来指定切点 1.3.创建Aspect,增加业务逻辑 ...
- java反射机制获取自定义注解值和方法
由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...
- SpringBoot启动时 提示没有主清单属性 MANIFEST
SpringBoot启动时 提示没有主清单属性 MANIFEST <?xml version="1.0" encoding="UTF-8"?> &l ...
随机推荐
- 使用方法拦截机制在不修改原逻辑基础上为 spring MVC 工程添加 Redis 缓存
首先,相关文件:链接: https://pan.baidu.com/s/1H-D2M4RfXWnKzNLmsbqiQQ 密码: 5dzk 文件说明: redis-2.4.5-win32-win64.z ...
- UVA-12657 Boxes in a Line (双向链表)
题目大意:一个1~n的升序数字序列,有4种操作.操作1,将x放到y前面一个位置:操作2将x放到y后面的一个位置:操作3交换x和y的位置:操作4反转整个序列.求经过m次操作后的所有奇数项的和. 题目分析 ...
- SGU 139. Help Needed! 逆序数,奇偶性,分析 难度:0
139. Help Needed! time limit per test: 0.25 sec. memory limit per test: 4096 KB Little Johnny likes ...
- 本地绑定域名及host做快速解析与域名屏蔽处理
在电脑中成功安装好IIS后,打开C:\WINDOWS\system32\drivers\etc\用记事本打开hosts文件,把127.0.0.1 localhost复制,粘贴到最后,然后把loca ...
- gson-2.2.api简单
使用gson的tojson和fromjson实现对象和json的转换 Gson gson = new Gson(); // Or use new GsonBuilder().create(); ...
- 一个简单的观察者模式的JS实现
这不是原创文章,主要是写给自己看的.原文比较详细容易让人,我提取最简单最好理解的部分,便于我以后用到.参考http://www.cnblogs.com/TomXu/archive/2012/03/02 ...
- Alpha阶段敏捷冲刺---Day1
一.Daily Scrum Meeting照片 二.今天冲刺情况反馈 1.昨天已完成的工作 昨天我们组全体成员在五社区五号楼719召开了紧急会议,在会议上我们梳理了编写这个程序的所有流程,并且根 ...
- 利用python完成多个url状态码的检测
import re import requests import json from threading import Thread,Lock from concurrent.futures impo ...
- python-websocket-server hacking
/************************************************************************* * python-websocket-server ...
- 使用LINQ获取List列表中的某个字段值
使用LINQ获取列表中的某个字段值,下面以获取员工列表中的编号字段为例子. 1.使用Select方法 List<Emplayee> emplayeeList = GetEmplayeeLi ...