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
    删除用户
  • 相关阅读:
    cmake安装配置及入门指南
    【算法篇】栈和队列专题之广度优先遍历和深度优先遍历
    【算法篇】链表专题
    【Android】JDK8标准下计算两个日期的时间差
    【MatLab】图片的拼接、滤色
    【C#】Winform开发笔记(持续更新)
    【Java】解决中文在post/get请求乱码的问题
    【C#】基于TCP的简单通信系统
    【Java】IDEA创建Web项目以及Tomcat配置
    【Java】模拟登录教务网并获取数据
  • 原文地址:https://www.cnblogs.com/zhimingxin/p/8182623.html
Copyright © 2011-2022 走看看