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
    删除用户
  • 相关阅读:
    Git(一):基础调用
    Vue(一):使用Vue创建项目并发布
    mysql用户与权限
    跨域理解及常用解决方案
    Ajax简单用法
    冒泡排序算法
    委托使用方式
    How to: Add the Analyze Action to List Views 如何:将分析按钮添加到列表视图
    How to:Customize Action Controls 如何:自定义按钮控件
    How to: Customize the New Action's Items List 如何:自定义新按钮的项目列表
  • 原文地址:https://www.cnblogs.com/zhimingxin/p/8182623.html
Copyright © 2011-2022 走看看