Spring启动时获取自定义注解的属性值
来源:互联网 发布:人民日报图文数据库 编辑:程序博客网 时间:2024/06/06 02:46
1.自定义注解
@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface PermissionOperation { /** * 权限Code * @return */ String code(); /** * 权限描述 * @return */ String description();}
2.场景
在项目中遇到一个场景,想获取所有注解为@PermissionOperation的code和description值保存到数据中,将所有的权限操作在启动的时候同步到数据库中,在Spring启动的时候获取特定注解@PermissionOperation的所有属性值,首先想到的是写一个监听器然后监听ApplicationListener 事件,具体代码如下:
@Componentpublic 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接口
@Componentpublic 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删除用户
阅读全文
1 0
- Spring启动时获取自定义注解的属性值
- @Value spring 注解 获取*.properties 的属性值
- android 自定义注解 通过反射获取注解属性值
- Spring的自定义注解
- Spring启动后获取所有拥有特定注解的Bean
- Spring启动后获取所有拥有特定注解的Bean
- Spring自定义注解实现Controller获取想要的数据
- spring boot 获取指定类中自定义注解的内容
- spring 的属性获取,取值.注解下的类和配置分离.
- Spring注解配置全局自定义@Transactional 属性
- Spring启动时注解扫描的问题
- 在spring的aop中获取自定义注解的参数值,即在切面中获取annotation的参数值
- java中自定义注解并通过反射获取注解属性值
- java中自定义注解并通过反射获取注解属性值
- java中自定义注解并通过反射获取注解属性值
- java中自定义注解并通过反射获取注解属性值
- Spring自定义注解的使用
- spring中自定义注解(annotation)与获取注解
- Vivado不同版本打开IP核锁定的解决办法
- STM32F207运用串口空闲中断+DMA接收不定长数据
- 百度之星初赛(B)--Chess---简单dp
- 集合的子集枚举
- 1.Binder系统_C程序示例_框架分析
- Spring启动时获取自定义注解的属性值
- mysql锁表机制分析--mysqlISAM
- 练习 2017-08-13 获取进程数据-编译和运行Java代码 问题在截图上 留待解决。
- BlockingQueue的使用
- poj3250翻译+题解(单调栈)
- python爬虫学习第二十天
- 二进制1的个数(剑指Offer)
- 自下而上的编程
- redis 内存管理zmalloc