聊聊AOP的应用场景及注意事项

AOP面向切面编程几乎每个项目都会用到,在方法上通过注解就能拦截数据,然后再做一些特殊的处理逻辑,跟面向对象是属于两种不同的维度。

传统的面向对象,就是把所有的业务逻辑放在一起,分散在不同的对象里面啊,有各种各样的方法、成员变量。所有的核心逻辑都是通过面向对象的方式来实现的,但是随着系统越来越大,很多非主要流程的内容也加入进来了,比如方法访问日志的记录,如果按照传统的面向对象的方式,可能就要在方法的入口处来增加log,但是log本身也不是特别重要,属于后面排查问题统计用的,但是却侵入了主流程的代码中,比较啰嗦,还会产生很多的代码冗余。但是如果通过AOP切面的方式来做就比较简单了,也就是在方法上添加一个注解就行了。注解的作用其实是为了拦截,拦截之后该写盘写盘,该落库落库,完全是异步的操作,不会影响主要的业务流程。除了方法的日志以外,还有其他的一些应用场景,比方说权限的判定,这个方法有没有访问权限也可以通过切面的方式,只有特定角色或者权限的用户,才能访问到某些敏感的操作,那么还可以利用AOP做全局异常的捕获,然后进行处理,还可以用于对系统的性能进行监控,比方说某个方法执行前后的时间或者统计查询数据库的次数等。

AOP,还有一点需要特别注意,就是要考虑失效的场景,比方说同一个类中的方法互相调用,A方法调用B方法,B方法的AOP的注解就会失效,这个是因为AOP要通过生成动态代理的方式来处理,但是同一个类中的方法互相调用是不需要经过代理的,所以AOP就会失效。解决方案也很简单啊,要么声明一下当前类的服务,然后通过代理的方式来进行调用,要么就移出当前类就可以了。还有无法让切面增强的方式,比方说像静态方法static,还有final修饰过的方法,也无法使用动态代理的方式来做,同样也会使AOP失效。另外还有一点呢,需要特别注意是方法中的事务,大部分都是基于AOP的逻辑来实现的,本质也都是为了捕获执行过程中的异常,然后进行回滚的,如果遇到AOP失效的场景,比如说,同一个类中的方法A方法调用B方法,B方法相当于被拷贝到了A方法里面,那么B方法中的AOP是失效的,所以B方法的事务,自然而然也跟着失效了,就相当于因为AOP的失效,间接引发了事务的失效,这一点在实际的开发过程中要特别的注意,因为事务的失效会带来一些数据不一致的问题。(完)

ps: 如果有任何疑问,欢迎评论区给我留言


已有 0 条评论

    感谢参与互动!