zoukankan      html  css  js  c++  java
  • 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
    删除用户
  • 相关阅读:
    Lc617_合并二叉树
    Lc257_二叉树的所有路径
    Lc222_完全二叉树的节点个数
    记github下载上传遇到的各种问题
    Lc101_对称二叉树
    Lc222_翻转二叉树
    二叉树的dfs 与 bfs (递归遍历)
    全球最火的程序员学习路线!没有之一!3天就在Github收获了接近1w点赞
    大二逃课总结的1.2w字的计算机网络知识!扫盲!
    「IDEA插件精选」安利一个IDEA骚操作:一键生成方法的序列图
  • 原文地址:https://www.cnblogs.com/zhimingxin/p/8182623.html
Copyright © 2011-2022 走看看