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