springAop如何实现权限管理数据校验操作日志

  

小编给大家分享一下springAop如何实现权限管理数据校验操作日志,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

前言

作为一个写java的使用最多的轻量级框架莫过于spring,不管是老项目用到的springmvc,还是现在流行的springboot,都离不开spring的一些操作,我在面试的时候问的最多的spring的问题就是我们在平常的项目中使用spring最多的有哪几个点
在我看来无非就两个

  1. spring的bean管理,说的高大上一点就是spring的ioc,di

  2. spring的AOP

spring是一个很强大的轻量级框架,功能远不止这两点,但是我们用的最多的就是这两点。

spring bean 管理

想我们常用的 @Controller @Service @Component 等等都是将我们的bean交给spring管理,我们在获取bean的时候就直接通过 @Resource 就可以获取,当然@Resource 不是spring的,@Autowired 才是spring的,这样我们可以很方便的管理我们的各种bean,使用起来也很方便,不用到处new

springAOP

这个应该是spring面试最常问道的问题了,我面试的时候一般不直接问,我会说一个场景,如果面试者使用过aop立马就可以回答出来。
有这么一个场景,一个系统已经开发完成了,而且已经上线运行了一段时间,很稳定了,现在要加一个功能,就是想收集用户的操作日志,操作日志要比较细致,比如 某某人,在哪个时间点,操作了哪个模块,请求的参数是什么样子的,操作结果如何,等一些比较细致的操作。很多面试者第一时间想到的就是使用过滤器,试想一下,过滤器真的能做到记录这么细致的内容吗?有的可能会想到,我们定义一个公共的方法,所有需要记录日志的地方都去调用这个方法,等等。其实这些都不好,最好的当然是使用aop,使用aop侵入性最小,系统已经稳定运行了,不能去动之前的代码,我们做个aop就可以了,对原来的代码几乎0侵入,对系统影响最小。
那aop实现的方式有哪几种呢?aop实现的步骤又是怎么样的呢?aop还能做些什么呢?这些问题如果在实际项目中使用过,一定能回答出来,如果没有使用过,估计有点难回答,这些都是项目框架的东西,很多公司的项目这一块已经封装好了,很多人直接一直在用,但是没有去查看源码,就不知道具体的实现,实现起来其实也很简单。

接下来我们就以一个小例子来说明下如何使用aop
aop总结起来最常用的就两种方式
1、采用声明的方式来实现(基于XML) 胡子眉毛一把抓,哈哈
2、是采用注解的方式来实现(基于AspectJ)精准定位
我习惯使用注解的方式,更加灵活,使用起来也方便,接下来就以注解的方式来讲下如何使用aop来做权限校验,数据校验,操作日志记录

申明切面

我们使用springaop,首先要将定义的类交给spring管理,然后使用aspectj 定义切面,我们要额外引入
aspectj

 
  ,,,,,& lt; groupId> org.aspectj
  ,,,,,& lt; artifactId> aspectjweaver
  ,,,,,& lt; version> 1.8.9
  & lt;/dependency> 
@ component   @Aspect   public  class  OperationInterceptor  {      }

定义切点

我们采用注解的方式,那么我们首先要申明一个注解

@Target ({ElementType.METHOD, ElementType.TYPE})   @Retention (RetentionPolicy.RUNTIME)   @Documented   @Mapping   public  @interface  GlobalInterceptor  {      ,/* *   ,,*,权限编码   ,,*/PermissionCodeEnum 才能permissionCode ();         ,/* *   ,,*,操作模块   ,,*   ,,* @return   ,,*/OperModuleEnum 才能;opObject (), default  OperModuleEnum.NO_OBJECT;      ,/* *   ,,*,操作描述   ,,*   ,,* @return   ,,*/String 才能;opDescription (), default ““;      }

然后在我们的切面中定义切点

@ component   @Aspect   public  class  OperationInterceptor  {      @Pointcut (“@annotation (com.xx.xx.GlobalInterceptor)“)   private  void  opMethods (), {   ,,}   ,,   }

定义通知类型

我们要输入还想要输出,那么我们就要将目标方法包围,所以使周围用

@ component   @Aspect   public  class  OperationInterceptor  {      @Pointcut (“@annotation (com.xx.xx.GlobalInterceptor)“)   private  void  opMethods (), {   ,,}   ,,   ,,@Around (“opMethods ()“)   public 才能;Object  doMethod (ProceedingJoinPoint 点),throws  BusinessException  {   ,,//TODO 业务代码   ,,return 零;   }   }

springAop如何实现权限管理数据校验操作日志