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启动时获取自定义注解的属性值的更多相关文章

  1. jquery下拉列表选中项改变时获取新选项的属性值

    $("#textSel").change(funtion(){ var selVal=$(this).val(); var selText=$("#textSel opt ...

  2. 使用AOP获取自定义注解的内容

    目录结构: 一:自定义注解 package org.example.annotation; import java.lang.annotation.ElementType; import java.l ...

  3. Spring中如何使用自定义注解搭配@Import引入内外部配置并完成某一功能的启用

    文章背景 有一个封装 RocketMq 的 client 的需求,用来提供给各项目收.发消息,但是项目当中常常只使用收或者发消息的单一功能,而且不同的项目 group 等并不相同而且不会变化,可以在项 ...

  4. 让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean

    让Spring Boot项目启动时可以根据自定义配置决定初始化哪些Bean 问题描述 实现思路 思路一 [不符合要求] 思路二[满足要求] 思路三[未试验] 问题描述 目前我工作环境下,后端主要的框架 ...

  5. Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理

    1.Column注解的的RetentionPolicy的属性值是RUTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理 2. 自定义注解: 使用@interfac ...

  6. 7 -- Spring的基本用法 -- 10... 获取其他Bean的属性值;获取Field值;获取任意方法的返回值

    7.10 高级依赖关系配置 组件与组件之间的耦合,采用依赖注入管理:但基本类型的成员变量值,应直接在代码中设置. Spring支持将任意方法的返回值.类或对象的Field值.其他Bean的getter ...

  7. AOP中获取自定义注解的参数值

      目录 一.利用注解实现AOP的基本流程 1.1.创建一个注解,用来注解切点(pointcut) 1.2.创建一个service,使用上面定义的注解来指定切点 1.3.创建Aspect,增加业务逻辑 ...

  8. java反射机制获取自定义注解值和方法

    由于工作需求要应用到java反射机制,就做了一下功能demo想到这些就做了一下记录 这个demo目的是实现动态获取到定时器的方法好注解名称,废话不多说了直接上源码 1.首先需要自定义注解类 /** * ...

  9. SpringBoot启动时 提示没有主清单属性 MANIFEST

    SpringBoot启动时 提示没有主清单属性 MANIFEST <?xml version="1.0" encoding="UTF-8"?> &l ...

随机推荐

  1. hdu2516斐波那契博弈

    刚开始想用sg函数做,想了半天没一点思路啊. 原来这是一个新题型,斐波那契博弈 斐波那契博弈模型:有一堆个数为 n 的石子,游戏双方轮流取石子,满足:1. 先手不能在第一次把所有的石子取完:2. 之后 ...

  2. 124. Binary Tree Maximum Path Sum *HARD* -- 二叉树中节点和最大的路径的节点和

    Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence ...

  3. hell 1>&2 2>&1 &>filename重定向的含义和区别

    当初在shell中, 看到">&1"和">&2"始终不明白什么意思.经过在网上的搜索得以解惑.其实这是两种输出. 一.linux重定 ...

  4. vue2 简单的留言板

    没有写样式,只是写个功能 <template> <div class="headers"> <div class="form"&g ...

  5. MVC3 之asp.net 与vb.net 互转练习

    vb.net mvc3相关教程http://www.asp.net/mvc/overview/older-versions/getting-started-with-aspnet-mvc3/vb/ad ...

  6. POJ 3414 Pots 暴力,bfs 难度:1

    http://poj.org/problem?id=3414 记录瓶子状态,广度优先搜索即可 #include <cstdio> #include <cstring> #inc ...

  7. 让IE兼容console——“由于出现错误80020101而导致此项操作无法完成”的解决方案

    问题描述 经测试发现问题只出现在: 1.原生IE8(其他版本IE模拟出的IE8无此问题) 2.从打开IE8没有开启过F12(曾经开启过又关闭的无此问题) IE8报错“由于出现错误80020101而导致 ...

  8. Mac安装并破解OmniGraffle7

    这个实际上不算破解,只是找到了可用的序列号 1.下载地址 https://www.omnigroup.com/omnigraffle 2.激活方法 Omnigraffle Pro 7注册码/许可证 名 ...

  9. Linux之 linux7防火墙基本使用及详解

    1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld  停止: systemctl disab ...

  10. DevExpress GridControl 单元格添加进度条(ProgressBar)

    首先可以使用DevExpress GridControl 自带的进度条控件. 但是我要用一个方法来设置所以的单元格进度,而不是每个单元格都要设置一遍,同时我想要根据进度值不同,进度条显示不同的颜色. ...