zoukankan      html  css  js  c++  java
  • Spring启动时获取自定义注解的属性值

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    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.例子

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

    这里启动之后要获取到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

    版权声明

    【本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究。若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!】

  • 相关阅读:
    C#的注释
    为知笔记发布到博客,css设置
    eclipse创建springboot项目的三种方法
    创建maven父项目以及子项目
    C# 快捷键(总结)
    idea 项目转 eclipse项目
    freemarker常见语法大全
    Spring Boot Freemarker特别篇之contextPath【从零开始学Spring Boot
    Spring mvc请求处理流程详解(一)之视图解析
    React+SpringBoot项目部署
  • 原文地址:https://www.cnblogs.com/onblog/p/13044259.html
Copyright © 2011-2022 走看看