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
刪除用戶

 

 

 

轉 : https://www.cnblogs.com/zhimingxin/p/8182623.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM